X



ふらっと C#,C♯,C#(初心者用) Part138
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 369a-msj4)
垢版 |
2018/06/05(火) 19:32:42.28ID:70UTtyrn0
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください

>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

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

■情報源
https://msdn.microsoft.com/ja-jp/library/gg145045.aspx
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://msdn.microsoft.com/en-us/library/gg145045.aspx
http://referencesource.microsoft.com/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0185デフォルトの名無しさん (ワッチョイ c251-G00F)
垢版 |
2018/06/17(日) 13:22:22.85ID:w8cOZ/cU0
>>184
整理していただきどうもありがとうございます。

(1) については実は疑問であるという認識をもっていたわけではなく、
ご指摘をいただくまで当然そうするべき事柄であると考えておりました。

(2) がまさに疑問点でして、(1) が Yes/No のどちらであっても
答えが得られると嬉しいと思っています。

> 非同期メソッドは使う側がそれを非同期メソッドだと理解している必要があるのに対し、
> 非同期メソッドじゃないものを非同期メソッドと誤認しても弊害はない

おっしゃる通りだと思います。(もちろん細かなオーバーヘッドが問題にならない場合の話ですが)

> 「このメソッドは多態の都合上Asyncでサフィックスされてるけど
> 非同期メソッドじゃないよ」みたいなコメントは必要か?

インターフェース等を介さずにメソッドを呼び出す可能性がある場合は
そのようなコメントがあると親切だと思いますが、
私としては、必ずしも必要ではないように思います。
0186デフォルトの名無しさん (ワントンキン MMe1-qG2Q)
垢版 |
2018/06/17(日) 14:33:41.38ID:IxLGC6rAM
>>183
気持ち良い悪いみたいな感覚の話にすると結論が出なくなる

・コードに統一感があったほうが気持ちがいい(俺はこの感覚がよくわからんが)
・使ってないものを使いますと宣言するのは気持ちが悪い

どっちも言い分としては間違いではないしどちらがより正しいかとも言えない
それは見た人によるとしか言えない
君が美しいと思って書いた統一感のあるコードは、俺からすれば必要のない無駄な記述の多い汚いコードに見えるかもしれない



それはさておき
asyncメソッドはTaskインスタンスの生成とスレッドの生成に繋がる可能性がある
インスタンスの生成はともかくスレッドを無駄に消費するってことはOS全体に負荷をかけることにも繋がりかねないので意味がないなら避けるべきだ
しかし文法上の間違いではないのでエラーと断言することもできない
間をとって警告を出すってのが妥当な落とし所じゃないかな
0190デフォルトの名無しさん (アウアウウー Saa5-m0US)
垢版 |
2018/06/17(日) 21:27:50.40ID:6Wp8R37qa
> async Task SayHello3() { await SayHello(); await SayHello(); await SayHello(); }
> async Task SayHello2() { await SayHello(); await SayHello(); }
> async Task SayHello1() { await SayHello(); }

と書くより引数nで実行回数を渡してforループで制御したらいい
n=0でasync awaitのペアがあるにかかわらず一度も実行されないawaitのついたメソッドができる
勿論警告もでないし誰かの言う一貫性のある美しいコードじゃないか
0191デフォルトの名無しさん (アウアウウー Saa5-m0US)
垢版 |
2018/06/17(日) 21:32:42.49ID:6Wp8R37qa
わかってると思うけどawaitがついたメソッドに突入した時点で
内部が自動的に別のスレッドで実行されるわけじゃない
中に入っても最終的にタスクにたどり着かないと別スレッドはスタートしない

System.Threading.Thread.CurrentThread.ManagedThreadIdでスレッドIDがでるから確認したらいい
0192デフォルトの名無しさん (アウアウカー Sa69-qcd4)
垢版 |
2018/06/17(日) 21:38:25.64ID:7lB5BPvGa
>>191
await後に書いた処理って元のスレッドに同期されると思ってたけど、awaitで実行されたスレッドのまま進むよね?
Formアプリであれ?invokeしなくていいの?って思った記憶ある。思い違いだったらすまぬ
0194デフォルトの名無しさん (ワッチョイ edd3-Bw3Y)
垢版 |
2018/06/17(日) 22:13:20.40ID:g+98DwlT0
>>193
Formが作成された所謂UIスレッドでは同期されるが、コンソールアプリ等では同期されない

もうちょい突っ込むと、await文が実行されるスレッドにSynchronizationContextへの仕込みがあるかどうかで違ってくる
await後に実行されるスレッドはSynchronizationContext.Postの実装により決定される

Winformsは最初のフォーム作成時にWindowsFormsSynchronizationContextを現在のスレッドに設定し
WindowsFormsSynchronizationContext.Postはメッセージループを仲介してUIスレッドでawaitの続きを実行する

具体的な実装はReference SourceやmonoのWindowsFormsSynchronizationContextを読むのが良い
0195194 (ワッチョイ edd3-Bw3Y)
垢版 |
2018/06/17(日) 22:18:16.07ID:g+98DwlT0
安価まちげーた>>192

なんかテキトーに書いたら分かりにくいな・・・
要はWinforms(WPFも同様)のスレッドでawaitするとその後の文は裏で勝手にControl.Invokeされてると思えばええねん
0196デフォルトの名無しさん (ワッチョイ c29d-zq67)
垢版 |
2018/06/18(月) 03:16:27.74ID:tq92Vuqu0
>>180
>Task Fuga() { } はコンパイルすらできない
それは戻り値のチェックで、int Fuga...でもコンパイルできないだろ
Taskもasync/awaitも関係ない話

むしろ、async Task Hoge() { } がタスク戻さないのにコンパイル通ることのほうが問題じゃね
つかほんとにこれ警告だけで通って正常に動くの?
そのときHoge()で何が帰ってきてるんだ?
0199デフォルトの名無しさん (アウアウエー Sa4a-jhA2)
垢版 |
2018/06/18(月) 10:59:47.44ID:ubyRHWyfa
どう考えても質問者の方がよく分かってるのに
何も分かってない奴に限って上から目線で偉そうに何か言ってるのは滑稽過ぎるねw

気付いてないのは本人だけ(とすら気づいてない)のも何とも笑いを誘う
0201デフォルトの名無しさん (アウアウウー Saa5-Bw3Y)
垢版 |
2018/06/18(月) 12:52:58.18ID:omBcANz0a
実際にawaitされることで呼び出し側が想定されることが実現されるなら
たとえ何もしない無駄なスレッドを使用したとしてもそれが一番いい
最適化されて何もしないとなればUIスレッドなどの副作用を期待していた呼び出し側が困る
実際はそういうことはおこらないので問題ない

上に書いてあったawait Task.CompletedTask;が一番いい答えだと思う
0203デフォルトの名無しさん (ワッチョイ c251-G00F)
垢版 |
2018/06/18(月) 18:38:53.61ID:rGsHjxJX0
皆さんレスどうもありがとうございます。

>>186
スレッド生成はともかく、無駄をなくすという観点は重要ですね。
>>198 に書いていただいてあることも踏まえると、
> しかし文法上の間違いではないのでエラーと断言することもできない
> 間をとって警告を出すってのが妥当な落とし所じゃないかな
というご意見は実に的を射たものであるように感じました。

>>190
> forループで制御したらいい
同じメソッドを繰り返し呼ぶ例は不適切でしたね。失礼いたしました。
ただ、for ループ版に n = 0 を渡しても何の問題もないのに
async Task SayHello0() { } では警告が出るというのも
やはり腑に落ちない感じがします。

>> 191
> 中に入っても最終的にタスクにたどり着かないと別スレッドはスタートしない
やはりそこが重要なポイントですよね。
だからこそ、最終的にタスクにたどり着かない選択肢がある方が
自然だと思うのですがいかがでしょうか。

>>193
> 非同期自体が複雑だし、(当時は)新しい構文ってことで、混乱を少しでも減らすために警告にしてるだけっぽいね
> 抑止しちゃっていいと思うよ
言われてみると、構文に不慣れな方向けの警告であるという考えは
とても納得ができました。
あとは、「自分は構文を十分に理解しているから警告を抑制しても構わないのだ」
という主張をいかにして人様に受け入れて貰うかが課題でしょうか(汗
0204デフォルトの名無しさん (ワッチョイ c251-G00F)
垢版 |
2018/06/18(月) 18:39:23.10ID:rGsHjxJX0
>>196
> むしろ、async Task Hoge() { } がタスク戻さないのにコンパイル通ることのほうが問題じゃね
> つかほんとにこれ警告だけで通って正常に動くの?
> そのときHoge()で何が帰ってきてるんだ?
確かに一見すると不思議ですよね。
このあたりの詳しい話は TaskAwaiter で検索するとお知りいただけると思います。

>>197 >>201
> await Task.CompletedTask
>>162 に書いていただいていることを仰っているのだと思いますが、
>>162>>161 の方法の不味さを説明するために await Task.CompletedTask を
引き合いに出されただけで、実際にこの方法を推奨されているわけではないと思います。
私自身も、async Task Hoge() { } と Task Hoge() => Task.CompletedTask; は
それぞれメリットがあるのに対して sync Task Hoge() => await Task.CompletedTask; は
すべての面で上 2 つに劣っていると考えておりますが、いかがでしょうか。

>>198
> 最適化してCompletedTaskでも返すのかなとも思ったけど
> IL見ると他と同じようにコード生成して実行してんね
大変ためになる情報をどうもありがとうございます。
私も確認してみましたが、async Task Hoge() { } と
Task Hoge() => Task.CompletedTask; との間にこれだけ IL のコードに差があると
前者を使うのは躊躇してしまいますね。そもそも私は
> このオーバーヘッドが必要な処理
になる状況が分からず、CompletedTask を返すように最適化が行われるべきだと思うのですが、
「await なしの async」と「CompletedTask 返し」との間の違いに気づいていらっしゃるようであれば
ぜひお教えいただけないでしょうか。
0206デフォルトの名無しさん (ブーイモ MMb6-l11B)
垢版 |
2018/06/18(月) 20:44:23.89ID:/4T5LZMPM
>>202が一を聞いて十を知る頭の良い人間なら先に一通り言語をマスターした方が効率的
そうでないなら最初から高度な機能を覚えてもそれが何の役に立つのか理解できないから、まずは基本だけで身をもって苦労したほうがいい
0207デフォルトの名無しさん (ワッチョイ c29d-zq67)
垢版 |
2018/06/19(火) 05:31:43.83ID:R/zbDFZs0
>>204
そもそもawait なしの asyncが必要な理由も場面も思い浮かばんが
自分一人でやってるなら好きにすればいいんじゃね

最適化うんぬんを言うなら、Taskを返すどころかそんな呼び出しそのものが不要じゃね
0208デフォルトの名無しさん (ドコグロ MM0a-1Yxh)
垢版 |
2018/06/19(火) 08:14:05.91ID:qYFKlpQqM
そもそものそもそもasyncやawaitで気軽にスレッドを立ててるような処理はだいたいバグってる
スレッドを立てるってそれ自体の処理より
立てても大丈夫なぐらいの前準備のが遥かに手間がかかる
気軽に立ててあるとこはまず間違いなくバグってるので安心していい
0209デフォルトの名無しさん (アウアウウー Saa5-l11B)
垢版 |
2018/06/19(火) 08:47:25.71ID:XF2Gjt0sa
asyncとスレッドって直接関係ないだろ
スレッドは非同期処理を実装する手段の一つに過ぎない
最近のazureなんか「上司にメール送って添付URLのページにある承認ボタンが押されるまで待つ」みたいな非同期処理ですらawaitできるんだぞw
0211デフォルトの名無しさん (JP 0H49-B+cT)
垢版 |
2018/06/19(火) 17:36:20.33ID:ygjnsczhH
google検索で
@it async await
これ読んでわかった気になった。
シンプルな実装では使えたけど、応用でつまずく。最近プログラム組んでないので頭固い……
0216デフォルトの名無しさん (オイコラミネオ MM49-B+cT)
垢版 |
2018/06/19(火) 20:12:26.56ID:ygjnsczhM
>>213
そこで、トゥルースリーパーとパチもんハズキルーペ買った。
パチもんの方はメガネにLEDライトが付いてたからつい。薄暗いとこであれはめちゃ便利(稀にしか使わないけど…orz)。(100金の老眼鏡でいいと思う。しょせん凸レンズの一種だから。)
トゥルースリーパーは半年くらいたってまだ箱の中orz
0219デフォルトの名無しさん (ワッチョイ 2e81-7EFb)
垢版 |
2018/06/19(火) 21:53:01.39ID:EPHYIqEL0
素人に使われると価値が下がるからね
素人は年収300万で死ぬまでくだらないコードを書いていればいいんだよ
0222デフォルトの名無しさん (ワッチョイ 428a-5g47)
垢版 |
2018/06/20(水) 09:42:33.52ID:+y79X+880
FileSystemWatcherのChangedイベントの発生条件は、監視しているディレクトリ内のファイルまたはディレクトリのサイズ、システム属性、最後の書き込み時刻、最後のアクセス時刻、またはセキュリティ アクセス許可の変更のようですが、
このうちのどれが変更されたか種痘するにはどうすればよいでしょうか?
0230デフォルトの名無しさん (ブーイモ MM62-P/8h)
垢版 |
2018/06/20(水) 22:31:23.62ID:hTxlP2+IM
ググり方を知らない典型
0236デフォルトの名無しさん (ワッチョイ 9fe3-Yk5b)
垢版 |
2018/06/21(木) 23:11:39.87ID:HAta7DXc0
xlsxならclosedxmlつかえば
0242デフォルトの名無しさん (スプッッ Sd9f-5Tpg)
垢版 |
2018/06/22(金) 06:50:27.01ID:PzKWFNpyd
会社が未だにxpが数台あって、数多くあるエクセルを開いて処理して閉じる開いて処理して閉じるってやると重いけどなんか早くなる方法ってある?
database?SQL?
VB6でそうやってエクセルファイルを扱って処理してるんだけど
0249デフォルトの名無しさん (ラクッペ MM33-2vzp)
垢版 |
2018/06/22(金) 10:09:55.10ID:lIRytxFLM
そもそも細々としたアイコンやメニューを大量に配置するのに適したUIではないわ
Azureコンソールとか見てても思うけど、マイクロソフトにUXデザイナーがいないってのは恐らく本当
0251デフォルトの名無しさん (ワンミングク MMdf-cOHa)
垢版 |
2018/06/22(金) 10:18:33.53ID:KB00qr+FM
web service(asmx)について教えてください。
利用する複数のアプリで使い回したいものをstatic変数に保持したいのですが、寿命が尽きるタイミングは分からないでしょうか?
具体的にはデータベースのconnectionでして、セッションをケチるために1つだけを使い回そうと考えています。寿命が尽きる時にdisposeしたいのですが、できない場合問題でしょうか?
0253デフォルトの名無しさん (ワッチョイ 7f11-8g2T)
垢版 |
2018/06/22(金) 10:51:01.98ID:32SF4tM80
>>244
値を縦に並べて合計との間に一本横線引いてあるだけとか、海外の資料じゃ良くあるよね

>>245
馴染めないという程じゃないけど、もうちょっと境界をはっきりして欲しいな
Windowsのデザインからしても最近のMSのトレンドなんだろうけど
0260デフォルトの名無しさん (バットンキン MM33-+a6w)
垢版 |
2018/06/22(金) 18:01:56.90ID:v3P4scZFM
今年独り社内SEとして入社しC#を選んだ者ですが、コンストラクタをオーバーロードして引数が有るものと無いものを作りました

よくよく考えると引数が無いコンストラクタのインスタンスを作って引数有りを前提にしたメソッドをコールすると最悪例外を出してしまうのですが、これは設計不良として検討し直しでしょうか?よくある事として許容されるでしょうか?
0262260 (バットンキン MM33-+a6w)
垢版 |
2018/06/22(金) 18:21:23.38ID:v3P4scZFM
やっぱり設計の問題ですよね
フィールドに初期値入れれば例外は起きないと思いますが、引数必須のインスタンスを作られたら無意味なメソッドが完成するというのは設計者失格ですよね
0263デフォルトの名無しさん (ワッチョイ ff9a-qn6i)
垢版 |
2018/06/22(金) 18:35:58.53ID:j0bZxxMK0
>無意味なメソッドが完成する
メソッド書き直すとかないんだ・・・
普通は条件が違えば呼ばれないようにするとかメソッド内部で分岐させるとかいろいろあると思うんだが
0264デフォルトの名無しさん (ワッチョイ 7f9d-hF4h)
垢版 |
2018/06/22(金) 19:36:18.31ID:fkpP2SFC0
>>251
>寿命が尽きるタイミングは分からないでしょうか
基本的には分からない
つかキャッシュ使え
そもそもDBコネクションならほとんどの場合でドライバ側でプーリングされてると思うが
0265デフォルトの名無しさん (アウアウエー Sa7f-3IMT)
垢版 |
2018/06/22(金) 19:43:22.50ID:RGVBxohIa
>>260
設計不良は大げさ過ぎw
普通に考えて

(1) 引数ありのメソッドは廃止。代わりにそのデータはプロパティでセットできるようにする。

(2) 引数なしのコンストラクタが呼ばれた時はプロパティの値は規定値が設定されるようにする

こんだけでしょう
0266デフォルトの名無しさん (ワンミングク MMdf-cOHa)
垢版 |
2018/06/22(金) 19:58:18.66ID:KB00qr+FM
>>264
データベース管理者から、なるべく接続を増やすなと言われてます。複数のPCから複数のアプリでアクセスするので、窓口を一本化するイメージです。
なのでプーリングはアプリ分の接続が残るので逆効果。
キャッシュを使うとは具体的にはどうするのですか?ググるヒントをもう少しください。
0267デフォルトの名無しさん (ワッチョイ 7f9d-hF4h)
垢版 |
2018/06/22(金) 20:38:24.35ID:fkpP2SFC0
>>266
>複数のPCから複数のアプリでアクセスするので
それサーバ側の話?
アクセスって何に?DBにアクセスするのは誰?

つか、そもそもそれWEBサービスに同時アクセスあったときにどうする気?
0273デフォルトの名無しさん (ワッチョイ 1f06-cOHa)
垢版 |
2018/06/23(土) 00:04:23.96ID:4A65QZOx0
>>267
クライアントPCからデータベースに接続します。webサービスで排他処理します。
サーバーの負担を増やしたくないとの事で、とにかく同時期にセッションを増やさないという方針は決定してます。
なので排他処理はどこかでやる事になるのですが、どこかのPCで動くアプリよりやり取りも含めて楽かなと思ったのですが。
0277デフォルトの名無しさん (ワッチョイ 7f9d-hF4h)
垢版 |
2018/06/23(土) 02:29:38.11ID:RCtrcOsy0
>>273
>クライアントPCからデータベースに接続します。webサービスで排他処理します。
webサービスは何をもらって何を返す気なんだ
なんにしても俺には想像もつかない方式を検討してそうだ
0278デフォルトの名無しさん (ワンミングク MMdf-h3K6)
垢版 |
2018/06/23(土) 06:55:53.26ID:DOoRmJ6HM
>>273
webサービスの中で普通にコネクションを開いて使い終わったらすぐにDisposeすればいいよ
ライブラリがいい感じにコネクション数を調整してくれる

どうしてもマニュアルでコネクションの数を制御したいならDB要求をループで処理し続けるスレッドを走らせて、他のスレッドとはキューで連携させる
0280デフォルトの名無しさん (ワッチョイ 1f75-E6HK)
垢版 |
2018/06/23(土) 09:10:53.59ID:kilEB0fc0
tes
0281デフォルトの名無しさん (ワッチョイ 1f75-E6HK)
垢版 |
2018/06/23(土) 11:25:15.28ID:kilEB0fc0
test
0282デフォルトの名無しさん (ワッチョイ 1f75-E6HK)
垢版 |
2018/06/23(土) 11:28:34.91ID:kilEB0fc0
fwくぇ
0283デフォルトの名無しさん (ワッチョイ 1f75-E6HK)
垢版 |
2018/06/23(土) 11:42:17.32ID:kilEB0fc0
fwq
0284デフォルトの名無しさん (ワッチョイ 1f75-E6HK)
垢版 |
2018/06/23(土) 11:44:04.15ID:kilEB0fc0
fwqef
■ このスレッドは過去ログ倉庫に格納されています

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