ふらっと C#,C♯,C#(初心者用) Part148

■ このスレッドは過去ログ倉庫に格納されています
2020/05/27(水) 20:28:41.27ID:Pggemlyq0
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)

「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980を踏んだ人は新スレを建てて下さい。>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■前スレ
ふらっと C#,C♯,C#(初心者用) Part147
http://mevius.5ch.net/test/read.cgi/tech/1582100741/
■関連スレ
C#, C♯, C#相談室 Part94
http://mevius.5ch.net/test/read.cgi/tech/1553075856/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/

■情報源
https://docs.microsoft.com/ja-jp/dotnet/standard/class-libraries
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://docs.microsoft.com/en-us/dotnet/standard/class-libraries
http://referencesource.microsoft.com/
・Insider.NET > .NET TIPS - @IT
https://www.atmarkit.co.jp/ait/subtop/features/dotnet/dotnettips_index.html
・DOBON.NET .NET Tips
https://dobon.net/vb/dotnet/index.html
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2020/09/26(土) 17:27:53.86ID:9d7CJAWD0
asyncはwaitしちゃだめ
理由は async デッドロック あたりでググって
2020/09/26(土) 17:31:36.79ID:+0bWtyAMM
>>290
どうしてもWait()使う場合はConfigureAwait(false)するかな
2020/09/26(土) 17:36:48.45ID:xSRIB2Tf0
>>292,293,294
数日間悩んでたのですが、教えて下さったキーワードを手がかりに調べ直してみます
本当に助かりました。ありがとうございます。
2020/09/27(日) 04:46:18.27ID:6sIZ9RBB0
Android, Electron などは、スレッドが2つある。
UI(描画)スレッドと、サーバー(バックグラウンド)スレッド

だから、2つのコンテキスト・文脈をまたがって、非同期などはできない。
異なる文脈の処理を呼び出すには、文脈を切り替えるような、特別な書き方がある

まあ、Windows のGUIアプリが、2つの文脈でやっているかどうかは知らないけど
2020/09/27(日) 07:46:38.96ID:WpoxB1nK0
>>296
知らんのかよ。
やってるけど。
2020/09/27(日) 16:39:54.69ID:BMd/NSoW0
>>290
多分非同期処理って調べるとasyncの例ばかりで自分で戻り制御する方法がよく
分からなくてTaskクラスでWaitすれば出来るとかって結論に達したんでないかと
思うのだけど・・・

まず、async指定されたメソッドは呼び出されるとメソッド全体を別スレッドとして
起動して処理を元のスレッド(この場合STAスレッド)に戻します
asyncメソッドの中でawaitを指定すると、メソッドの内容に関係なく元のスレッドに
戻るのは変わらないですが、asyncメソッドの中でawaitで指定されたメソッドが
終了するまでasyncメソッドのスレッドだけが待ち状態になり、awaitから返って
くるとawait以降を実行しasyncメソッドの最後まで行くとasyncメソッドのスレッド
だけが終了されます

検証してないので予想なのですが、Taskクラスで管理するスレッドを起動して
いない(Task.Run)状態でWaitをかけるとSTAスレッドを待つためにsleepして
しまいますがSTAスレッドはループスレッドなので当然いつまで待っても終了
しません
asyncスレッドではawaitの処理が終わって復帰しようとしても元になるSTA
スレッドがsleep状態なので、こちらもawaitから返ってこないみたいなことが
起こっているのだと思います

2のコンソールアプリの場合にはループスレッドではないのでMainの処理が
終了した時点で続きが動くのではないかと

3は正しい使い方で、STAスレッドは動かしたままbutton1_Clickメソッドが別スレッドで
動作する際にclient.GetStringAsyncの処理を待っているので普通に動作します

button1_Clickの中で待つのであればasyncメソッドを作る意味がないですし、async
メソッドで裏で動かすのであればbutton1_Clickで待ってはいけないので3の様な
形で実装するか、asyncメソッドの返却値をただのstringにして、textBox1.Textに
メソッドの返却値が入る形式に変える(こっちは試してないので嘘かも)のが正解じゃ
ないかな
2020/09/27(日) 18:04:42.91ID:co99WLAO0
つまり非同期すればハゲるということですね。
2020/09/27(日) 19:27:47.55ID:0F2CG6otd
>>290
@でやるなら自分はcontinuewithするかなあ
あとhttpclientは毎回使い回すのはあまり良くなかった気がする
2020/09/27(日) 19:28:51.84ID:0F2CG6otd
>>300
x使い回す
○作り直す
2020/09/28(月) 02:24:40.60ID:QIpyCS2B0
JavaScript が難しいのは、非同期が基本だから。
コンテキスト・文脈が異なる。
時間の進み方が異なる世界で、同期を取らないといけないから

Ruby が簡単なのは、同期が基本だから。
非同期の方がオプション

Android, Electron がややこしいのも、2つの文脈の同期を取る必要があるから。
1つのアプリ内に、GUI・非GUI の文脈がある

例えば、Electronなら、Main は、Node.js のCUI スレッドで、
Renderer は、GUI のChromium スレッド

双方は、決められた書き方をしないと、同期・通信できない
2020/09/28(月) 06:18:20.07ID:ii9XSMYC0
>>290です
>>296
コンテキスト・文脈という概念がまだ把握できてないのでそこが課題だと思ってます
>>298
自分は独習C#という本をテキストにして勉強しています。
その中で、>>291のAと似たコードが記載されていて、
これを使ってasync/awaitの基礎が説明されています。
そこで、フォームアプリで真似してみたんです。
デッドロックについてはいろいろ調べてみて基本的な理屈は理解できました。
ただ、Aのコンソールアプリでデッドロックが起きない理由がわかりません。
コンソールアプリはループスレッドではないからとのご指摘が重要だと思っていますが
まだ理解が浅くてモヤモヤしてます。
あと、
>まず、async指定されたメソッドは呼び出されるとメソッド全体を別スレッドとして
起動して・・・
の下りですが、スレッドが3つあると考えればいいのでしょうか?
a.STAスレッド(2のスレッドを呼び出したスレッド)
b.async指定されたメソッドを処理するスレッド
c.client.GetStringAsync(url)を処理するスレッド

これはAのコンソールアプリでも同じですか?
bについては独習C#には書かれていなかったので
aとbは同じスレッドだと思い込んでいました。

調べてみてよく分かったのですが、理解できていない概念が多すぎますね。
今の時点で安易に触ってしまうと変に誤った先入観を持ってしまいそうです
この辺をわかりやすくしっかり説明している書籍等、ご存じないでしょうか?

結論としては
基本的にフォームアプリの中でWaitを使うな
使いたいならConfigureAwait(false)で回避しろ
ということなのかなと思っています
2020/09/28(月) 07:01:50.95ID:ii9XSMYC0
>>303
修正
a.STAスレッド(bのスレッドを呼び出したスレッド)
2020/09/28(月) 07:59:26.50ID:nO4ceNb30
すいません入門書に以下のコードがあるんですが実行してもピクチャーが真っ白で変になってるんですが
何が間違ってるんでしょうか;
https://gyazo.com/de388825132a1ac42b21b7cbb8a069fd

画像を置いてる場所はここです
https://gyazo.com/93530ea51ef1e88cbcd097846d409ca4
2020/09/28(月) 08:35:58.50ID:lkQsRi/q0
表示したい画像はどんな内容なんですか?
2020/09/28(月) 08:52:18.25ID:QIpyCS2B0
>>303
コンテキスト・文脈が異なるとは、全く別世界・異次元。
時間の進み方も異なるし、全く感知できない。
通信・同期もできない

未定義の動作と同じ。
あらゆる仮定・推測ができない

だから、双方が連絡するには、特別な書き方をしないといけない

普通の言語では、例外も補足できない。
他方で例外を投げても、伝わらない

だから、ストールするのは、文脈が異なる場所で、例外が起こっている可能性もある。
起こっていても分からないから

本を買うよりも、検索して調べた方がよい。
こういう説明が載ってる本は、まずない。
余程、マニアックな本だけだろう
2020/09/28(月) 08:53:38.64ID:phqY8Xtx0
FormのControlsに追加しなくてもいいんだっけ?
2020/09/28(月) 08:59:13.21ID:Zg0P7tB00
>>303
C#による マルチコアのための非同期/並列処理プログラミング
ttps://gihyo.jp/book/2013/978-4-7741-5828-0

C#によるWindowsシステムプログラミング 第2版
ttp://www.cutt.co.jp/book/978-4-87783-468-5.html

この2冊しかしらん
もっといいのを知ってる人いたらよろしく
2020/09/28(月) 09:04:53.56ID:QIpyCS2B0
確かに、GUI の根幹には、永久のイベント(メッセージ)ループがある。
イベントドリブン

ずっと、ユーザーからのマウスイベントなどが、キューに入るのを待っている。
キューにイベントが入ると、それを処理する。
それを永久に続ける

一方、CUI では、そういうイベントドリブンは聞かない。
マウス操作で、何かをするというのも聞かない。
Ctrl + C を押して、割り込み処理を発生させることはできるが

でも、こういうアプリの終了などのソフトウェア割り込みも、イベントループで拾うけど
2020/09/28(月) 09:08:06.54ID:QIpyCS2B0
そんな難しい本を読んでも、理解できないから無駄だと思う

検索した方がよい
2020/09/28(月) 09:11:10.60ID:Zg0P7tB00
>>305
用意した画像の一部だけが表示されている
たとえば、
pb.SizeMode = PictureBoxSizeMode.StretchImage;
といった感じでPictureBoxSizeModeを指定してみると何が起こってるのか何となくわかるんじゃね?
2020/09/28(月) 09:42:36.85ID:Uql71HHWa
>>310
ctl+Cまで入力コマンドを待つCUIアプリはイベントドリブンと呼べるのでは?
2020/09/28(月) 09:50:37.80ID:o994bwz+0
>>310
CUIでもターミナルベースの業務アプリなんかだとイベントループ書くぞ。
2020/09/28(月) 10:20:17.53ID:QIpyCS2B0
結局、GUI・CUI も、どちらもイベントドリブンなのか

大部分は同じなのかも
2020/09/28(月) 10:59:03.73ID:o994bwz+0
>>315
お前Electronの内容もちょっと変な理解してるし、毎回思うけど知ったかぶりしないほうがいいぞ。
結局Rubyの事しかわかんないんでしょ。
2020/09/28(月) 11:27:34.04ID:j++FlVxl0
Delphiに存在したメタクラス型(クラス型を代入、参照できる変数)は
C#に無いの?
2020/09/28(月) 11:42:34.18ID:ii9XSMYC0
>>309
ありがとうございます
アマゾンレビューをチラ見したところ目的に合ってそうです
>>311
とりあえず頑張ってみます
2020/09/28(月) 11:53:52.45ID:phqY8Xtx0
>>317
Typeは?
2020/09/28(月) 13:53:50.99ID:j++FlVxl0
Typeでもある程度事は足りるけど、
あらゆる型のtypeof()を代入できるので不確実だし、Activatorとか必要で面倒。
無いなら仕方ないが…まあ移植が大変
2020/09/28(月) 18:57:37.61ID:nO4ceNb30
>>312
そのプロパティ?はまだ本内で教わってないですが使ったら表示されました。
ありがとうございます!!
2020/09/28(月) 22:54:29.00ID:iemn9XLz0
>>310
CUIなRTOSなんて普通にあるけどなぁ
2020/10/10(土) 10:58:06.91ID:RvE6O+PE0
.NET Coreでコンソール画面に
「こんにちは、WORLD!」と表示させようとすると
なぜか「こんにちは、WORL!」のように表示されます

コンソール画面のメニューからフォントを変更すると正しく表示されますが原因が分かりません
2020/10/10(土) 11:22:49.95ID:OZkIKLkD0
コンソール画面とは?
2020/10/10(土) 12:42:00.94ID:YPdRC9Oi0
>>323
コード貼れ
2020/10/10(土) 13:17:16.07ID:RvE6O+PE0
static void Main(string[] args)
{
 var str = "こんにちは、WORLD!";
 Console.WriteLine("{0}", str);

 Console.ReadKey();
}
2020/10/10(土) 17:53:06.91ID:wYCx593I0
>>326
これかな?
https://aquasoftware.net/blog/?p=895
2020/10/10(土) 17:57:00.27ID:wYCx593I0
>>326
これも
https://csharp.clock-up.jp/contents/dotnetcore/codepage-encoding
2020/10/10(土) 19:40:42.12ID:RvE6O+PE0
>>327 >> 328
試してみましたが改善しません

出力をコピーしてメモ帳にペーストしてみると正常なので
どうも文字化けではないようです

文字の表示位置がずれて重なっているような感じです
2020/10/10(土) 20:03:24.77ID:wYCx593I0
>>329
こちらでは正常なんでコンソール画面のプロパティの設定がおかしいんでは?
2020/10/10(土) 20:04:01.51ID:c6WyhNHPd
何てフォント?
2020/10/10(土) 20:23:39.28ID:RvE6O+PE0
MSゴシックの18ポイント、Windows8.1です
来週会社のパソコンで試してみることにします
2020/10/10(土) 20:41:27.03ID:wYCx593I0
>>332
8.1はプロパティでレガシーコンソールのチェックある?あったらそれチェックでいけるんでは?
2020/10/10(土) 20:52:24.98ID:RvE6O+PE0
ないです
2020/10/10(土) 21:17:43.96ID:RlZbVDXEa
何にもアドバイスできないのに恐縮だけど、

>コンソール画面のメニューからフォントを変更すると正しく表示されますが
だったら具体的にどのフォントで問題が発生してどのフォントで発生しないか
確認した範囲で書いた方がいいのでは

あと、普通テキスト変えていろいろ試さないか?
2020/10/10(土) 21:50:46.82ID:wYCx593I0
他のアプリでMSゴシックの18ポイント使ってみ。フォントのファイルが正常かどうか
使えるなら8.1のコンソールウィンドウの問題でしょ
337デフォルトの名無しさん (ワッチョイ 1b02-tHo0)
垢版 |
2020/10/10(土) 23:23:35.42ID:wgBcrtZd0
>>320
Typeで事足りそうなものだが…

あるいは設計の問題かも。
どんな設計なのかも書き込んでみたら?
2020/10/20(火) 10:49:57.27ID:N2Y7+9Dy0
ローカルでiTextSharpを利用して、
Json形式のデータからPDF帳票を作る・・てのつくったんだが、
(サーバ上で、APIコールとかファイル読込でPDFファイルを返したかった。
 イメージ的にはページごとにTextとかLineを指定したJsonデータ)
いざ業務に転用できるかなってフェーズにきて
iTextSharpのライセンス(AGPL)がやだなあ、って思ってる。
PDFSharpは日本語がなんかうまくいかない。

今のC#で、PDFを作るの、皆さんはどうやってる?
2020/10/20(火) 10:55:16.27ID:0/xBmjm30
>>338
業務だったらExcelCreator使ってる
340デフォルトの名無しさん (ワイーワ2 FF3f-Vszw)
垢版 |
2020/10/20(火) 10:59:00.80ID:pHiz9StDF
PDFSharp使ってるけど問題無し
2020/10/20(火) 11:10:22.94ID:d69BLAaZa
React、Vueで帳票レンダリング
ヘッドレスブラウザでPDF印刷
342デフォルトの名無しさん (ワイーワ2 FF3f-Vszw)
垢版 |
2020/10/20(火) 11:13:59.21ID:pHiz9StDF
日本語不安ならグラフィック直接PDFに張り付けろ
2020/10/20(火) 12:28:25.89ID:eHl8PxCr0
PDFSharpは日本語の折り返しに対応してなかったぞ。
344デフォルトの名無しさん (ワイーワ2 FF3f-Vszw)
垢版 |
2020/10/20(火) 12:50:06.87ID:pHiz9StDF
>Json形式のデータからPDF帳票を作る

これが折り返しするかどうかだな
2020/10/20(火) 13:46:22.13ID:N2Y7+9Dy0
皆さんありがとうございました・・・
方針としてはPDFSharpをもっかいいじくり倒して、他にもいろいろ試してみます・・・
プレプリント紙への印刷やめたい

>>339
そんなソフトあるんですね!サーバ版たけぇ・・

>>341
クライアントサイドのレンダリングはちょっときついです、環境バラバラなんで

>>342
自分にはグラフィックをちょうどよくテンプレにはめる設計力がなさげ

>>344
折り返しするんですよね。。
まあそれ以前使うフォントが特殊でつまずいたっていうのがありましたが
2020/10/20(火) 13:50:07.09ID:d69BLAaZa
>>345
クライアントサイドじゃないよ
サーバーでヘッドレスブラウザ使ってPDF出力してレスポンス返すだけ
2020/10/20(火) 14:00:01.34ID:0/xBmjm30
>>345
Excelで帳票のテンプレート作ってそれをPDFにできるんでめっちゃ楽
みんな慣れてるでしょExcel帳票w
2020/10/20(火) 15:28:40.52ID:N2Y7+9Dy0
>>346
そうなんですね!ちょっと見てみます

>>347
Excel帳票大好きです(大嫌いです)
2020/10/20(火) 16:09:37.19ID:CqCKSidt0
C♯が現在最強言語らしいので勉強したいのですが
マイクロソフトはVB6の開発を打ち切ってプログラマを裏切った過去があるそうで
なかなか踏み切れずにいます。。。
C♯は20年後も開発が続いてると思いますか?
教えてエロい人
2020/10/20(火) 16:14:23.52ID:Nb9oJ8Mwd
そんな先のことなんざわからん
確実に言えるのは今勉強している技術を20年後も変わらずに使い続ける前提でいるような技術者は居ない(と信じたい)
生き残ってるなら初期学習がない分少し楽かもしれないけど、新しいのが台頭してくりゃそちらを新たに学習するだけ
2020/10/20(火) 16:25:01.94ID:CqCKSidt0
そうですか。先のことは誰にもわからないですよね。
逆に20年後も確実に主力な言語ってPythonくらいかな?
2020/10/20(火) 16:25:26.41ID:cR623l/E0
>>349
開発が続いてる言語の新しい技術についていくような人はどんな言語でもすぐ学べる
2020/10/20(火) 16:31:38.91ID:CqCKSidt0
>>352
新しい技術について行く用意はあるんですが
言語の基本的な記述などのルールが変わるのが面倒なんですよね。。。
2020/10/20(火) 16:45:13.07ID:0/xBmjm30
C#ほど後方互換性を重要視している言語ってなかなかないと思うけどね
2020/10/20(火) 16:48:10.12ID:CqCKSidt0
>>354
そうなんですか。ではC♯を勉強すれば基本記述まで変更なんて
事はしばらくはなさそう?ですね。。。
勉強してみます!!
2020/10/20(火) 17:16:01.37ID:nipGGPAZa
>>353
勉強が1ヶ月続くかどうかも怪しい奴が20年後の心配をするのは馬鹿げているぞ。
そんなことじゃ、何かを勉強し始めたとしてもことあるごとに足踏みして前進できない未来しか見えない。
2020/10/20(火) 18:10:04.06ID:kSL2D2eBa
OfficeのマクロはまだVBなんだっけ?
2020/10/20(火) 18:13:11.84ID:Nb9oJ8Mwd
そだね
python使えるようにするみたいな話はあったけど進行してるのかな?
2020/10/20(火) 18:15:13.55ID:ATqqkPAW0
>python使えるようにするみたいな話
頓挫したぞ
2020/10/20(火) 19:53:46.10ID:c2x7XoZLd
贅沢言わないから.NETにpython入れてVisualStudio(codeじゃない方)でサポートしてくれるだけでいいのに
361デフォルトの名無しさん (ワッチョイ ab5f-UsEC)
垢版 |
2020/10/20(火) 21:29:38.81ID:j1S9Ds0j0
それIronPythonと何が違うの?
2020/10/20(火) 21:48:49.93ID:iUu5GsdY0
>>357
まだExcelのWeb版だけみたいだけどJavaScript/TypeScriptが使える
マクロじゃなくアドインならC#やF#みたいなCLR言語ならなんでも可だったかと
2020/10/20(火) 22:16:42.30ID:jgnvePEX0
ChromeベースのWebView2がやっとラウンチしたようだね。まだ.netじゃ使えないが
Previewで確認したところマウスの戻るボタンが使えるのがいい所だな
2020/10/20(火) 22:51:38.52ID:kSL2D2eBa
>>362
へーそれは知らんかったありがと。
2020/10/20(火) 23:36:15.59ID:CqCKSidt0
>>361
IronPythonって2.7っしょ
使えないな。。。
2020/10/21(水) 00:36:52.32ID:0KDGF23Y0
なんかうろ覚えなんだが
こういう非同期処理の書き方ってちゃんと動いたっけ?

if(!locked){
 locked = true;
 await xxx.Task;
 locked = false;
}

async/awaitは同じスレッドに戻るからこんな単純なロックでも問題無いって昔判断したような記憶はある
2020/10/21(水) 09:14:18.23ID:hl6LkBs90
ソースの一行単位でスキがうまれるので無理じゃね
ifとlocked=trueの間に実行されてる
2020/10/21(水) 09:16:03.92ID:hl6LkBs90
1行単位どころじゃなかった
意味不明なところでも割り込みあるわw
2020/10/21(水) 09:43:40.30ID:eNSg6QZpH
四捨五入の結果がおかしいのって自分だけかな・・・

decimal v = -0.0195m;
decimal rounded = Math.Round(v, 2, MidpointRounding.ToPositiveInfinity);
Console.WriteLine(rounded);
ってすると、小数点2桁までになるよう(小数点3桁目を)四捨五入するので
-0.02になるはずなのに、結果が-0.01になっちゃうんですけど・・・
2020/10/21(水) 09:56:42.42ID:lxmGvu010
>>366
Taskの中でlockする
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/lock-statement
371デフォルトの名無しさん (ワッチョイ 1d1a-8DiG)
垢版 |
2020/10/21(水) 12:02:28.19ID:sg7OOy0L0
>>366-368
awaitで同期取ってるから問題ない

>>369
To Positive Infinityだから正数寄りになる
ゼロを基準にしたければMidpointRounding.AwayFromZeroを指定する

await(待つ)もそうだが、変な日本語のリファレンスよりも明快な解説が変数名に詰まってるんだからお前らはまずその単語をGoogle翻訳に掛けるべきだと思うわ
2020/10/21(水) 12:16:57.36ID:hl6LkBs90
>>371
いや
if(!locked){
実行
別タスクlockedのfalseを見て処理開始
 locked = true;
別タスク割り込まれたら困る処理開始
 await xxx.Task;←別タスクと衝突
 locked = false;
}

起こるじゃん
373デフォルトの名無しさん (JP 0H22-pYMh)
垢版 |
2020/10/21(水) 13:03:41.62ID:eNSg6QZpH
>>371
-0.01と-0.02の中間(MidPoint)である-0.015のときの丸め方(Rounding)として
「MidpointRounding.ToPositiveInfinity」を指定したつもりだったのですが・・・
MidPointじゃないときにも「ToPositiveInfinity」が適用されちゃうんですね・・・

JavaScriptのMath.Round()とおなじような(四捨五入される桁の数字が5の場合に
正の無限大の方向で丸める)四捨五入をしたかっただけなのですが、
関数を自作しないとだめみたいなので自作します。
お騒がせしました。
2020/10/21(水) 13:30:40.39ID:UaTtUbsy0
await絡みのときは、排他制御はSemaphoreSlim使うのが定番ですよ
https://www.atmarkit.co.jp/ait/articles/1411/11/news117.html
2020/10/21(水) 13:44:12.17ID:RtxzEAIBa
四捨五入:わかる
銀行丸め:わかる
正の無限大の方向で丸める:何の意味があんのそれ?
2020/10/21(水) 13:52:03.73ID:xBoANC0iM
切り上げって知ってる?
377デフォルトの名無しさん (ワッチョイ 1d1a-8DiG)
垢版 |
2020/10/21(水) 14:15:10.32ID:sg7OOy0L0
>>373
それならこんな感じで簡単に作れるから頑張れ

static decimal[] table = new decimal[]{1E0m, 1E1m, 1E2m, 1E3m, 1E4m};
static decimal Round(decimal num, int pow) => Decimal.Floor((num * table[pow]) + 0.5m) / table[pow];

decimal num = Round(-0.015m, 2); // -0.01

>>372
普通にメインスレッドから叩いていればこうなるからな

if(!locked){ // thread 1
 locked = true; // thread 1
 await xxx.Task; // thread 2
 locked = false; // thread 1
}
2020/10/21(水) 14:19:07.15ID:lJjSrE40d
正負どっち方向に動くかわかんない変換より確実に方向がわかっている変換が必要なことはあるよ
2020/10/21(水) 14:26:27.71ID:RtxzEAIBa
-2.4 → -2
-2.5 → -2
-2.6 → -3
こういう丸めが意味を持つケースが一般的とは思えない

>>376
知らないのは君だと思うよ
2020/10/21(水) 14:32:15.81ID:lJjSrE40d
5捨6入って特定に分野では一般的な計算方法では?
俺は使わないけど
2020/10/21(水) 14:33:15.98ID:RtxzEAIBa
>>380
3.5 → 4
なんだよ
2020/10/21(水) 14:47:36.44ID:8k52si4D0
それでもう.NET5使ってええの?
2020/10/21(水) 14:52:13.96ID:v0oiVQF00
いいよ
2020/10/21(水) 15:00:31.64ID:5E7rZ8hS0
>>377
それが問題になるのは、そのifブロックが複数スレッドで実行されたときだからな
2020/10/21(水) 16:37:46.89ID:APVpE4AA0
>>377
はじめのlockedをみてるガードは別スレッドからのアクセスに対して無力だよ
そこはおk?
>>377の番号で言ったらThread3以上のスレッドからの話ね
386デフォルトの名無しさん (ワッチョイ 1d1a-LA9s)
垢版 |
2020/10/21(水) 17:36:18.89ID:sg7OOy0L0
>>385
つまりこういうのを危惧してるのか?

Task.Run(() => {
 if(!locked){
  locked = true;
  await xxx.Task;
  locked = false;
 }
});

だとしたらこんなのは仮定に持ち出すのがそもそも間違い
それ言い出したらフィールド操作するあらゆるメソッドで「並列で呼び出される可能性がある」とlock()で括らなきゃいけなくなってしまう
2020/10/21(水) 17:53:44.86ID:lxmGvu010
ifブロックがシングルスレッドでしか実行されない状況で
lockが必要な状況ってどういうの?
2020/10/21(水) 17:55:56.87ID:5E7rZ8hS0
元の質問がマルチスレッドでのロックに関する質問だと思うのだがな

このコードはスレッドセーフですか?
いいえ危険です

みんなが回答してるのはそういう事
このスレの趣旨や質問者のレベルを考えると妥当な仮定と回答だと思うぞ
2020/10/21(水) 17:58:26.66ID:5E7rZ8hS0
>>387
再入すればやばい気がしないでもない
390デフォルトの名無しさん (ワッチョイ 1d1a-LA9s)
垢版 |
2020/10/21(水) 18:02:52.19ID:sg7OOy0L0
元の質問って>>366だろ?

> async/awaitは同じスレッドに戻るからこんな単純なロックでも問題無い

「同じスレッドに戻る」を認識してるなら疑いなくtrueやん
ここで「でも別スレッドで動かしたら危険」と言うのは質問の前提を崩してる
2020/10/21(水) 18:14:17.17ID:MqdNiLmu0
崩してないな。
2020/10/21(水) 18:19:06.78ID:5E7rZ8hS0
そのawaitしてるのはasyncメソッドだから、メインスレッドからのみ呼ばれるとは限らん
つまりもどるのがメインスレッドだとは限らん

というの理解しているのならまあ大きなお世話だと言えなくもないが
あとフォームアプリじゃなければ、もとのスレッドに戻るも保障されないけどな
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況