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

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

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

■前スレ
ふらっと C#,C♯,C#(初心者用) Part146
https://mevius.5ch.net/test/read.cgi/tech/1576069931/
■関連スレ
C#, C♯, C#相談室 Part95
https://mevius.5ch.net/test/read.cgi/tech/1508168482/
■コードを貼る場合は↓を使いましょう。
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/04/03(金) 18:01:25.86ID:UoNKEVCn0
>>208
SDIではなく、複数の子ウィンドウを作りたいのです。
2020/04/03(金) 18:17:58.72ID:lfI6G99C0
SetParentで養子に出してしまえ
2020/04/03(金) 18:25:08.62ID:UoNKEVCn0
>>206
読んだんですが、該当する箇所は無いようです。
有れば教えてください。
213デフォルトの名無しさん (アウアウウー Sae9-1s42)
垢版 |
2020/04/03(金) 18:30:10.60ID:ytDWP9uSa
>>209
親のMenuStripのAllowMerge = falseだね
デフォでマージされないはずだと思ってたけど勘違いだった
2020/04/03(金) 18:40:10.41ID:UoNKEVCn0
>>213
親Formの AllowMerge を falseにするということは、どんなMDIに対しても
影響が及ぼされてしまうんですね。
一部のMDI Chileだけは個別にメニュー付きで、他のMDI Childは、親のメニューにMerge、という具合には出来ないんですか。
215デフォルトの名無しさん (エムゾネ FF43-8H9x)
垢版 |
2020/04/03(金) 18:46:29.17ID:VVxcL9MvF
そこまでこだわるなら floating menu 造って子ウィンドウに載せろ
216デフォルトの名無しさん (アウアウウー Sae9-1s42)
垢版 |
2020/04/03(金) 18:51:31.33ID:ytDWP9uSa
>>214
そういうヘンテコなUIはどうかと思うけど、
マージしたくない子のMenuStripのAllowMerge = falseでいけるみたい

っていうかこれぐらい自分で試そうよw
2020/04/03(金) 19:07:26.69ID:UoNKEVCn0
>>211
MDI Child Frame(?)の子として中に別の Window を入れるのでしょうか?
2020/04/04(土) 00:11:51.82ID:8ZllyE370
いくら初心者向けのスレッドっても少しは自分で試してみなよ
2020/04/04(土) 12:59:15.20ID:PIJg3gqB0
コードを変更しても反映されない
いきなり原因不明のエラーが出ると思ったら
Form1.Designer.csの中で勝手にプロパティ初期化してた
2020/04/04(土) 17:22:20.79ID:9nDXuupl0
VS2019のメニューを見ていると、MFCと同様に、無効な項目は
グレイ表示されています。
MFCの場合は、Merge方式ではない代わりに、ActiveなChildWndが
ハンドラを実装していない場合には自動的にグレイ表示になっていたのですが、
WinFormsの場合は、どうやれば良いのでしょうか?
221デフォルトの名無しさん (アウアウウー Sae9-1s42)
垢版 |
2020/04/04(土) 19:04:00.44ID:UFbKis4ca
>>220
1年前にも似たような質問があった気が。
MFCは知らないのであれだけど、多分MFCに近いやり方は用意されてないかと。

結果的に同じようなUIをなるべく簡単に実現するには、1年前にも書いたけど
MDI子に共通のメニューを持つFormをまず作って、
個々のMDI子はそれを継承するのがいいんじゃないかなあと
2020/04/04(土) 19:30:33.10ID:C11LX2Y60
>>221
それで、ハンドラを実装したくない継承クラスでは、その項目を disable にするという
わけですか。
223デフォルトの名無しさん (アウアウウー Sae9-1s42)
垢版 |
2020/04/04(土) 19:59:31.83ID:UFbKis4ca
そうそう。
継承後のフォームでもデザイナでコントロールのプロパティーの値を変更というか上書きできたはず
ついでに、MenuStripのVisible = falseにしておけば親にマージされている時以外メニューは表示されないみたい
2020/04/06(月) 03:12:51.01ID:O7BKGhOT0
ビル・ゲイツが私財でコロナのワクチン作る。
c# プログラマに一番最初にワクチンを供給してくれるとおもう。

安全性の確認できないワクチンや薬品をc#プログラマにぶち込めば開発効率が上がる。

人体実験を断ったら、msdn、マイクロソフトid を停止させるとかして、Windows 利用不可にすればいい。
c#コンピューターオタクは断ると当面お金を稼げなくなるから喜んで実験に参加してもらえるはず。

まと、コンピューターオタクには人権はないので、実験により貴重な人命が損なわれることもない。
2020/04/06(月) 07:14:18.13ID:GDVBsc7B0
MSが作るワクチンなんてバグだらけになってそうでこわひ
2020/04/06(月) 08:02:15.03ID:m5eAFRE+M
ワロタ
2020/04/06(月) 09:39:40.09ID:78vqHF1U0
弱毒化ミスりました。てへ
2020/04/06(月) 09:46:00.73ID:xLTmiL/Q0
そんなミスされたらゲイツの顔がブルースクリーンになっちゃう
229デフォルトの名無しさん (アウウィフ FFe9-8H9x)
垢版 |
2020/04/06(月) 10:17:13.45ID:TxMJ3ToxF
>>224
先生そういう宗教的な分野はMacとかSwiftとかの方が適していると思います
2020/04/06(月) 11:37:10.89ID:O7BKGhOT0
>>225
c# プログラマにベータ版ワクチンをインストールしてもらいデバッグするんですよ。
バグのないワクチンとソフトウェアはありません。

Macユーザーは完成後のワクチンは提供対象外。

だから、MacBook とかに Windows をインストールしてる人は、デバッグと実験の対象になりますが、完成したワクチンの提供は対象外となります。
2020/04/07(火) 17:59:28.45ID:Fz3MtvZy0
visualstudioで
フォームアプリに追加したクラスライブラリにclass1.csとclass2,csがあるんですけど
class2の方にコントロールを継承してもツールボックスに表示されないのはなぜでしょうか
class1だと表示されました
2020/04/07(火) 18:09:18.22ID:haJ3Gg0r0
GoogleドライブにファイルをアップをしたくてGoogleの下のサンプルを
参考に動かしてみたのですが、全くアップできず何が悪いのかさっぱりです・・・

https://developers.google.com/drive/api/v3/quickstart/dotnet
https://developers.google.com/drive/api/v3/manage-uploads

以下がコードです。
https://dotnetfiddle.net/4z2iZ4

ファイルのリストは、取得できているので認証はできていると思うのですが
「var file = request.ResponseBody」の行で、fileがnullとなっており
次の行でエラーが発生しています。

どなかたお助けください。よろしくお願いいたします。
2020/04/07(火) 18:10:40.64ID:Zxvg5mpZ0
>>231
追加部分をビルドしてもツールボックスに表示されないのなら該当するVSのスレで聞いてくれ
2020/04/07(火) 18:23:44.41ID:Fz3MtvZy0
>>233
VSスレ行ってきます
235デフォルトの名無しさん (アウウィフ FFe9-8H9x)
垢版 |
2020/04/07(火) 18:42:39.03ID:G5F9VLMpF
>>232
var driveService = new DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "MyApplicationName",
});

使ってない?
236デフォルトの名無しさん (アウウィフ FFe9-8H9x)
垢版 |
2020/04/07(火) 18:55:57.94ID:G5F9VLMpF
あとは
var fileMetadata = new Google.Apis.Drive.v3.Data.File(){
Name="test.png",MimeType="image/png",};
にしてみるとか
他にはstreamがbinaryになってるかどうかとか

https://gist.github.com/LindaLawton/ead22e44bf88c3afa60753de0445eddf
この人もnullって言ってるな
237デフォルトの名無しさん (アウウィフ FFe9-8H9x)
垢版 |
2020/04/07(火) 18:58:19.21ID:G5F9VLMpF
さすがstackoverflow
https://stackoverflow.com/questions/45662041/null-response-creating-file-using-google-drive-net-api
238デフォルトの名無しさん (アウウィフ FFe9-8H9x)
垢版 |
2020/04/07(火) 19:00:30.98ID:G5F9VLMpF
っていうか
DriveService.Scope.DriveReadonly
じゃだめな気がする
2020/04/07(火) 19:02:03.78ID:haJ3Gg0r0
>>235
すみません。そこ使っていません。コメントアウトしました。
51行目でDriveServiceを宣言しているので、そこでの宣言は不要でした。
2020/04/07(火) 19:42:25.67ID:haJ3Gg0r0
>>237
>>238
出来ました!ありがとうございます!!
なるほど!一度作ったjson消さないと駄目なんですね。
本当にありがとうございました!!
2020/04/08(水) 18:42:37.41ID:4ZoNAvx+0
バルクコピーはdatatableだけに対応なのでしょうか?
ググってもジェネリックで使う記事が見当たらないので無理なのかなという気がしていますが
2020/04/08(水) 21:01:32.25ID:SnWF1IxV0
SqlBulkCopyの話ならWriteToServerのオーバーロード見る限り
IDataReader頑張って実装すれば何とかなりそう
2020/04/08(水) 22:55:22.95ID:t+YdRhnM0
ググればToDataReaderの拡張メソッドヒットするからそれ参考に実装すればいいんじゃね
俺社環でライブラリの拡張メソッド禁止されているから、IDataReaderで作ったけど
2020/04/09(木) 07:09:54.80ID:9rfBAHbp0
>>243
知らない知識なので参考にさせて頂きます
しかしバルクコピーのメソッドがdatatableという古い技術で実装させる時点で、そもそもバルクコピー自体が古い技術で別の最新技術があるのかなと疑っております
色々な角度で調べてみるつもりです
2020/04/09(木) 07:57:03.98ID:WaI3ZH+Vr
datatableってもう古いの?
2020/04/09(木) 08:44:51.87ID:lA8JDzIo0
win10において
・ネットワークとインターネット設定→プロキシのセットアップスクリプトを使う設定のON/OFF切り替え
・ネットワーク接続のインターネットプロトコルバージョン4のプロパティの
IPアドレスを自動的に取得すると、次のIPアドレスを使うの切り替えと入力
DNSサーバー・・・と次のDNSサーバーのアドレスを使うの切り替えと入力
これをC#アプリで実現できますか?どのようなクラスを使えばいいでしょうか?
2020/04/09(木) 09:25:00.65ID:x5VgstST0
レジストリいじれば設定変更できるやつだろ
ようはwin32だろ、それくらいまでは調べたよな?
2020/04/09(木) 10:21:54.03ID:uYq8FGtT0
IPアドレスの変更の類はnetshコマンドをProcessクラスで使うのが一番手っ取り早いと思う
2020/04/09(木) 11:12:18.01ID:x5VgstST0
ローカルじゃなければProcess使うかなあ
2020/04/09(木) 11:17:42.26ID:MvrijcPz0
目的にもよるんだろうけど、PowerShellでスクリプト書く方が早そうな予感
完全にスレチになるけど
2020/04/09(木) 11:21:39.40ID:wyC9Ec3D0
内部でPowerShellスクリプトを走らせるC#プログラムを作る
252デフォルトの名無しさん (ワイーワ2 FFfa-zfCe)
垢版 |
2020/04/09(木) 12:41:32.88ID:kpg/tOgGF
>>248
ほんそれ +1
253デフォルトの名無しさん (ワッチョイ 6ff1-Xgk8)
垢版 |
2020/04/09(木) 12:48:40.23ID:XKMcLRnY0
x ほんそれ
o ほんとそれ

正しい日本語で
2020/04/09(木) 14:07:27.20ID:wyC9Ec3D0
日本語を母国語としない人ほど
正しくない日本語で困るのです
255デフォルトの名無しさん (ワッチョイ d701-jz5X)
垢版 |
2020/04/09(木) 21:32:00.67ID:ezz+hw670
ハンソロ
2020/04/10(金) 07:07:24.38ID:xmb7c5Fr0
>>245
新規開発でdatatable使ってたらうわってなる
2020/04/10(金) 08:53:16.36ID:9rsnwyfyM
>>256
今は何ですか?
2020/04/10(金) 08:53:52.31ID:GJl9p4h50
型付きDataSet
2020/04/10(金) 09:00:25.56ID:3BYzeKcKM
>>245
もうEFかDapperでええやろ
2020/04/10(金) 09:43:04.90ID:Rte1PrgOr
あーそういや気付けばdapperばっか使ってたわ
あいえにゅめにゃんにゃんが便利やしなあ
2020/04/10(金) 10:18:31.70ID:XzeHNtat0
DBとは無関係に
動的列、フィルタ&ソートしたまま行追加、みたいなのが必要な時はDataTable使ってる
262デフォルトの名無しさん (ワイーワ2 FFfa-zfCe)
垢版 |
2020/04/10(金) 11:00:45.18ID:nz1tlAhXF
DataTableでうわぁっってなるひとはJSONでくぇぇっってならんのまじで?
2020/04/10(金) 11:58:55.10ID:dIu9zrlt0
jitとか使ってそう
2020/04/10(金) 12:04:16.89ID:sXssV4F30
DataTableは2次元
JSONは3次元
2020/04/10(金) 13:26:59.74ID:saZPvfHU0
EFもDapperも変更追跡がなぁ
2020/04/10(金) 13:54:32.33ID:/e8vDB+E0
>>265
Dapperにそんなもんあったっけ?
2020/04/10(金) 14:10:46.01ID:saZPvfHU0
>>266
ないよ
DataSetにはあるんだよ
2020/04/10(金) 14:29:32.62ID:/e8vDB+E0
EFにはあるやろ
2020/04/10(金) 15:28:01.76ID:SuSUfgJ80
Chartコントロールで横のスクロールバーを表示させる方法を教えてください。
サンプルプログラムは↓のをほぼそのまま使いました。( i < 5のところを i < 500に変えて数だけ増やしています)
チャートは普通に表示されるのですが、いろいろ探してもスクロールバーの出し方が全然わかりません。

https://qiita.com/Aki_mintproject/items/02e98173eb8eee74fc5b
270デフォルトの名無しさん (ワイーワ2 FFfa-zfCe)
垢版 |
2020/04/10(金) 16:05:22.34ID:eaxyjA8iF
https://stackoverrun.com/ja/q/1249648
271デフォルトの名無しさん (ワイーワ2 FFfa-zfCe)
垢版 |
2020/04/10(金) 16:06:49.77ID:eaxyjA8iF
https://docs.grapecity.com/help/c1/aspnet/webchart/addscrollbartothexax.html
2020/04/10(金) 19:04:23.80ID:saZPvfHU0
>>268
ここで言ってるのはモデルが自分自身の変更内容を保持する機能な
EFにもないよ

もちろんモデルに自分で作りこめば可能だけどな
2020/04/10(金) 21:43:50.98ID:Q8afigXi0
DatasetやTableのoriginalが取れたりrejectでロールパック出来たりするのは確かに便利
2020/04/10(金) 22:14:18.97ID:phkDJesv0
トランザクションログ
2020/04/11(土) 02:58:17.93ID:EYr99YyX0
よぉ〜しよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよし
2020/04/11(土) 13:19:24.89ID:n/kHMKTa0
>>270
ありがとうございます。解決しました
277デフォルトの名無しさん (ワッチョイ c62d-kdbN)
垢版 |
2020/04/12(日) 16:27:59.95ID:WBJoN6ah0
if(条件A && !条件B){}
みたいなことをしたいのですが、&&と!をまとめてきれいに書く方法はありますか?
2020/04/12(日) 16:48:42.14ID:insvI+xF0
var 条件C = 条件A && !条件B;
if(条件C){}
2020/04/12(日) 18:02:02.30ID:Vvo4XdlE0
クラスや関数にする
設計を見直す
あーりーりたーんを心がける
2020/04/12(日) 18:08:22.86ID:sgzIx9p/0
>>277
そんなものはない
C# 演算子
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/
2020/04/12(日) 18:11:50.67ID:7/OoXgJO0
>>277
関数にする
2020/04/12(日) 19:13:16.89ID:tx1YNXXn0
if (foo.IsEnabled && !bar.IsEnabled) を
if (foo.IsEnabled && bar.IsDisabled) にすることはある

単語の頭につけるエクスクラメーションマークは
見落としやすいから可読性がやや低い

>>278のパターンで変数にすることはあんまりないけど関数化するのもよくやる
2020/04/12(日) 19:22:29.59ID:xeq/pDNWa
>>277
おそらくそのまんまが一番きれいで見やすいぞ。
条件が長い式なら>>278みたいに一旦、適切な命名の変数に入れるのがいいと思う。
284デフォルトの名無しさん (ワッチョイ c62d-kdbN)
垢版 |
2020/04/12(日) 19:43:51.07ID:WBJoN6ah0
一発で書けるのかなと、すごく疑問に思ってたよ
ありがとう!
285デフォルトの名無しさん (アウアウウー Sabb-KL7n)
垢版 |
2020/04/12(日) 21:05:32.57ID:0dL6T2+Wa
一発で書けた
if (b ? false : a) {...}

一発で書けた
if (!(!a || b)) {...}

一発で書けた
Func<bool, bool, bool> ippatu = (x, y) => x && !y;
if (ippatu(a, b)) {...}
2020/04/12(日) 21:27:27.71ID:JCmsoVoe0
XORでいいんだったら^一個で済むけど違うよな
2020/04/12(日) 21:57:13.58ID:NV9JxSja0
Not演算子が見辛いから関数に置き換える
ぐらいでいい気はする
2020/04/12(日) 23:13:55.75ID:PHqFJcwka
>>285
1つ目は短絡評価の場合の動作が異なるから等価な式になってないし、2つ目の式は元の式より見辛くなって無意味だろう
289デフォルトの名無しさん (ワッチョイ cb5f-zfCe)
垢版 |
2020/04/13(月) 10:34:31.41ID:xWnIwwwl0
>>286
カルノー図描いて観ろ
2020/04/13(月) 11:05:23.07ID:DkcwYYbx0
それでわかるのー
ベイチ図もありだね
https://qiita.com/YankeeDeltaBravo225/items/48000cdf01dde7698930
2020/04/13(月) 14:35:31.90ID:6KK4qS560
てかそんな条件がパット見でわからんくなるなら、根本的にそこにいたる道筋がおかしいと思うよ
2020/04/13(月) 17:03:53.08ID:wlUJ1QGb0
SSH.net使った事ある人います?
フォワードポイント設定後、Startしてプログラムは通ってるんですけど、なぜかポートが開かないので困ってます
RloginというフリーのSShソフト使うと同じポートが開くので、SSH.net側かVS側が原因と考えてます
ネットの先人たちの知恵を拝見して同じようにしてるんですけど、なぜか上手くいきません

開発環境
VS2017
Nugetより最新のSSH.netを入れてます

netstatコマンドでポートの確認したら、192.168.〜の所が開かず、[::]の所が開いてるようです
これはなんなんでしょう?
2020/04/13(月) 17:14:22.22ID:Szw9E2890
>>292
ポートじゃなくてIPどうなってんの?
見た感じv6が開いてそうな感じだけど。
2020/04/13(月) 17:18:05.18ID:ujcK/XL20
ポートフォアード開始してる?ステップインで状態とエラーメッセージ追えば理由なんとなくわかるんじゃね?
2020/04/13(月) 17:41:05.66ID:wlUJ1QGb0
>>293
>>294
返信ありがとうございます!
>>293さんのおっしゃる通りv6が開いてました
フリーソフトは両方開けてくれてたので、そこで勘違いしてました
こんな簡単な事でスレ汚してすいませんでした
ありがとうございました
2020/04/13(月) 19:23:38.52ID:o+L/gyE50
拡張メソッドがあるのに、拡張プロパティなどが無いのは何故でしょう?

多くの日本語解説サイトで DirectoryInfoではなくDirectoryを、EnumerateFilesでなくGetFilesを使ってるのは何故でしょう?
 (対応していないバージョンのC#を利用する人も、その方が高速・妥当なコードも稀だと思うのですが…)
2020/04/13(月) 19:55:51.75ID:i5ardRu40
>>296
> 拡張メソッドがあるのに、拡張プロパティなどが無いのは何故でしょう?
Why No Extension Properties?
https://blogs.msdn.microsoft.com/ericlippert/2009/10/05/why-no-extension-properties/

> 多くの日本語解説サイトで
解説を書いてるヤツらに聞け
2020/04/13(月) 20:03:19.03ID:Bv/vlgUb0
拡張プロパティの類はC#10かもうちょい先ぐらいで追加されそう
https://ufcpp.net/blog/2018/7/pickuproslyn0714/
2020/04/13(月) 20:08:08.68ID:Wzp4v7WxM
>>298
最悪の提案だな
言語にこういう横断的関心事を入れられるようになるとだいたい無茶苦茶になるから、絶対にやめてほしい
2020/04/13(月) 20:26:56.25ID:o+L/gyE50
>>297,298
なるほど 確かにC#3.0に並んでるものと比べたら、優先度低くても全然不思議じゃないですね
将来的な実装を心待ちにしておきます ありがとう!

開発チームの内情というか現実的な部分の説明が面白かったw

>>299
言われてみれば、強力な反面 把握し辛い奇想天外なクソコードも書きやすくなりそうですね
2020/04/13(月) 20:49:56.31ID:4T6PL/Gc0
>>298
リフレクション使うとどんな挙動になるんだろ
2020/04/13(月) 21:10:08.00ID:Bv/vlgUb0
>>301
今の拡張メソッドと特に変わらんのじゃない?

>>299
ちなみに言語にこういうのを入れて滅茶苦茶になった言語ってどんなのがある?
どんな感じに滅茶苦茶になったのかな
2020/04/13(月) 21:18:16.05ID:VqvNVGMOa
>>302
そういう失敗例ならScalaでも見てみたら
2020/04/13(月) 23:30:22.44ID:IBaPMQxT0
Taskとasync/awaitの使い方について質問です
await Task.Delay(100);

task.Wait();
を組み合わせるとデッドロックすると色々なページで書かれていますが

試したらデッドロックしませんでした
https://ideone.com/d6BWCC

ConfigureAwaitもよく分かっていません(コンテキストとかマーシャリングとかも・・・)
https://docs.microsoft.com/ja-jp/dotnet/api/system.threading.tasks.task.configureawait?view=netframework-4.8

なぜデッドロックしなかったのか教えてください
2020/04/13(月) 23:33:06.25ID:LODcFAHq0
>>304
guiでWaitメソッドを使ってみて
2020/04/14(火) 00:04:17.51ID:wwnZT3mo0
WPFで適当なボタン作ってクリックイベント内で同じようなことをしたらフリーズしました
GUIじゃなければ起きない、とかでしょうか
CUIだとフリーズせず実行できてしまいます
2020/04/14(火) 02:23:36.56ID:hp+6QaJX0
・UIスレッドは1つしかない
・GUIアプリの場合、await後は生成元のスレッドに戻ろうとする
・ところがUIスレッドはawaitしている
・お互い待ち合うことでデッドロック発生

CUIの場合はawait後に元のスレッドに戻らないのでデッドロックしない。
GUIでもAsync1、Async2のメソッド内で
await Task.Delay(100).ConfigureAwait(false);
とすればデッドロックしないが、Async1やAsync2でDelay後にUI部品触ると(ボタンのキャプション変えるとか)落ちる
2020/04/14(火) 09:01:56.56ID:wwnZT3mo0
なんとなくわかった気がしました

SynchronizationContext.Currentで取得できる同期コンテキストでawaitの動作が変わってるみたいで
CUIはもともとnull、WPFは
await Task.Delay(100).ConfigureAwait(false);
のあとはnullになるようです

一度nullにしてしまえば
await Task.Delay(100);
Async().Wait();
とやってもフリーズしませんでした
というかCUIと同じようにawait毎にスレッドがコロコロ変わるようになります

逆にCUIでも同期コンテキストを設定してしまえばデッドロックも起こせるみたいです
SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext());
とやったらCUIでもフリーズしました

普通のnew SynchronizationContext()ではフリーズしないので、知らない仕掛けがありそうですが
同期コンテキストの作られ方によってawaitの動作が変わるから
デッドロックが起きたり起きなかったりする、という感じがしました
2020/04/14(火) 11:04:24.75ID:27IsOs6K0
WinformsやWPFは各々フレームワークのコンポーネントの初回呼び出しで
それぞれ専用の同期コンテキストを自動で現在のスレッドに設定して
await 式から自動生成されたコードで現在の同期コンテキストのSendやPostを呼び出してるって割と単純な話だわよ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。