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

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

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

■関連スレ
C#, C♯, C#相談室 Part93
https://mevius.5ch.net/test/read.cgi/tech/1492818720/
■前スレ
ふらっと C#,C♯,C#(初心者用) Part139
https://mevius.5ch.net/test/read.cgi/tech/1533466544/
■コードを貼る場合は↓を使いましょう。
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
2018/11/02(金) 17:41:50.22ID:KsjOw3TM0
>>340
「近い点」の定義は?
座標差が10以内の場合を0に近いとした場合
p.X=p.X-p.X%20+((p.X%20)>10?20:0)
Y座標にも同じような計算式を適用
でそのコピペしたところに組み込むときは画像範囲外の座標を指定した場合はリセットされるので、その辺も改変しないと
2018/11/02(金) 17:44:00.81ID:1rdv+QTJ0
リージョン
2018/11/02(金) 18:39:24.09ID:Zmz30XyOa
>>340
マウス座標に一番近い格子点の座標を求める方法って意味なら、

(1) マウス座標を囲む4つの格子点を返すメソッドを書く(マウス座標が格子点上の
場合に何を返すかは適当に決めて)

(2) マウス座標と任意の座標の距離(の2乗)を求めるメソッドを書く(ラムダ式でいい)

(3) LINQのOrderByでも使って(1)と(2)から求められる
2018/11/02(金) 18:43:56.30ID:Zmz30XyOa
今気づいたけど、MSDNのリファレンス、無茶苦茶見づらくなってない?
拡張メソッドはどこで見られるのこれ?
VS2010時代の人力で翻訳されたドキュメントも読めなくなってるし....

MSっていらんことする天才だなw
Googleもそうだけど
2018/11/02(金) 18:48:39.64ID:3EaYIZ29M
「英語で読む」が付いて格段に読みやすくなったわ
英語読めない人は大変だなw
2018/11/02(金) 19:00:33.18ID:YQK0i7tX0
サンプルコードがないメソッドを報告するって付けてよ
2018/11/02(金) 22:00:12.56ID:qBR9F2NOM
chromeの翻訳は実用十分
MSDNは昔より酷いよな
英語です読むオプションが便利やね
2018/11/02(金) 22:05:20.63ID:n/9UgDRl0
>>344
docsじゃなくて?
2018/11/03(土) 01:49:56.08ID:m4AFUYcO0
>>340
数学の問題かな
マウスの座標を20で割って商nと余りを求める
余りが0<10
x=20n
余りが10<20
x=20(n+1)
yも同様にして座標が求まる
2点の座標p1,p2に線を引く
これの繰り返し 
2018/11/03(土) 02:19:46.79ID:++9uwWwJa
グリッドならわざわざ距離なんか求めずX軸Y軸独立に最近傍検索しても同じことか
そりゃそうかw
351デフォルトの名無しさん (ワッチョイ 4ea5-PRUr)
垢版 |
2018/11/03(土) 07:55:15.80ID:SApjZlYC0
>>345
コンストラクタ、プロパティ、方法、イベント
「方法」ってなんだ?
と思ったらメソッドかよ!
こんなクソ訳付けられるなら英語の方がマシだなwww
352デフォルトの名無しさん (ワッチョイ 5b80-Q1ft)
垢版 |
2018/11/03(土) 08:03:39.30ID:rSl2Ac3O0
ついにMSもバカをきりすてはじめたか
いちいちバカの相手をしてたら大変だからな
2018/11/03(土) 11:23:12.64ID:+zJSXhjW0
方法はさすがに草
2018/11/03(土) 12:53:13.50ID:q2N3VeHVa
あえて誰にでも間違いがわかるバカな翻訳を残すことで、
俺達はもう英語の読めないバカジャップを相手にする気はない、英語を読むか廃業しろ、
というメッセージを伝えようとしているのだろう
2018/11/03(土) 13:25:00.49ID:XovyTjqY0
デバッグ用のビルドはこの設定ファイル、リリース用のビルドの時はあの設定ファイルの値を組み込みたい
ってときはどうやるの
2018/11/03(土) 13:37:41.08ID:N8ATSODSM
>>355
ビルドで切り替えるなら #if DEBUG で十分
Web開発で使われるような動的な設定の切り替えは、同じビルドを環境に応じた異なる設定で実行したいというニーズにおいて使用するもの
Webだと、ビルドしてステージング環境でテストしてそのまま同じものを本番にデプロイするんだよ
2018/11/03(土) 17:26:27.47ID:Kq73EWlFd
デリゲートって関数登録して好きなタイミングでそいつ呼べますよって使い方のイメージだけども違うんかね
2018/11/03(土) 18:29:16.11ID:SHI5qsHHa
>>357
前にも書いた気がするけど、本質はデリゲートっていう概念を導入することによって
デリゲート型の変数が作れるってことだと思うよ。

C#からデリゲートがない言語を見た場合、それは
デリゲートのリテラル( = メソッド)の定義は出来るのにデリゲートの変数の宣言はできない不自由な世界に見える
2018/11/03(土) 23:43:38.27ID:QP19bU4J0
数作ってる内に最初の設計こそが一番大事な気がしてきた
が、それで最後まで行けた試し無し
2018/11/04(日) 00:27:59.79ID:Ujv6OCQma
設計においては全体像を常に持ちながらもフェーズに応じて必要以上に詰めすぎることなく適切な抽象度に留めるバランス感覚が重要
厳格なウォーターフォールだろうとアジャイルだろうとそこは同じで、最初から細部を詰めようとするのは確実に時間の無駄
2018/11/04(日) 00:56:11.57ID:ycEmTONY0
設計力を高める(学習)するのに適切な書籍またはサイトがあれば教えてください。
2018/11/04(日) 00:56:42.60ID:316Hfb/o0
まあそうなんだけど、前工程が適当だと後工程が確実に割を食うじゃん。
どこら辺にいい加減があるんだろうな。
2018/11/04(日) 01:09:06.89ID:xCAdckZOM
>>361
ちょっと古いけどこれなんかわりと有名
https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff650706(v=pandp.10)
2018/11/04(日) 10:06:20.84ID:TRDIKx2zM
権力のあるところがざっくりやって、弱い連中に細かいとこ押し付ける。
365デフォルトの名無しさん (ワッチョイ 5ba5-PRUr)
垢版 |
2018/11/04(日) 10:54:42.18ID:iKmrkyIQ0
ユーザーなども含めた他人の意見をフィードバックしようなどと
色気を出した瞬間、どこまで詰めるかなんて分からなくなる
結局一人で設計してどこまでやるかなんて一人で決断するしかない
アプリなんて自分が使って満足ならOK
2018/11/05(月) 15:59:03.10ID:QhIuz4Ucd
disposeを継承したクラスのインスタンスのデストラクタが参照があるときに呼び出されてるのだけど
そんな現象に見回れた人居ませんか
disposeの継承は関係ないかもしれないけどそのクラスの作りは今そうなってます
2018/11/05(月) 16:25:54.17ID:9y9XQ9xCM
ありえない
今更CLRのそんな基本的なところがバグってるなんて考えられないから、バグがあるのは間違いなく貴方の目か頭の方です
2018/11/05(月) 17:39:02.66ID:ci20RGBId
>>340
これって前打った点と新しい点を線引いてるけど、前の点はどう記憶してるんですか?前の点にもう一個情報を持たすのは可能ですか?
線が被った時、線をずらして書こうと思ってるんですけど、
例えば↓2マス↑6マスとクリックして書いたとき被るのをちょっと右にずらして書くのは出来たんですけど、
条件をpt.X==p.X && pt.Y<p.Y
だと変わって欲しくないときもズレる。

ズラす条件は直角で、始点を0を基点として
↓に引いた時は左
↑に引いた時は右
←に引いた時は上
右に引いた時は↓
2018/11/05(月) 19:35:41.47ID:W+eHh5+20
>>368
>前の点はどう記憶
フィールドのPoint pt
描画範囲が被る場合の判定がちょっと思いつかないけど
前の点にもう一個情報じゃなく描画した点の位置を全部記憶してからになる気がする
線描画を半透明にして被った場合にもわかるようにとか駄目なの?
2018/11/05(月) 23:06:04.46ID:CiuGU7fm0
>>367
ありがとう
めっちゃ上位層でインスタンス破棄されてました
2018/11/06(火) 00:58:16.86ID:2irnAq2B0
>>368
pt = pが前の点の記録
2018/11/06(火) 16:46:04.32ID:KNaAB8gP0
async/awaitが難しすぎる
一見簡単そうに見えるんだけど、結構注意深く使わないとこれはまるよね
(Web見ていると使い方で注意事項多いし)

これって、MS的には何を目指したものなの
最初見た時は、初心者向けかなと思ったら偉い難しいのでびっくりした
BackgroundWorkerなんて、結構納得しやすかったのに
2018/11/06(火) 17:49:22.75ID:Irg6T2PQa
そこはそんなに難しく考えることないかと

「非同期的にAの終了を待機してその後Bを実行」みたいなコードを
普通のシーケンシャルな処理みたいに書けるようにするためじゃないの?
2018/11/06(火) 18:02:29.90ID:tGae1nmw0
まぁ初心者向けというか、Progress<T>等でも実装を隠蔽しつつ
UIスレッドで行うべき処理を文脈的に記述しやすく…?

いや、個人的にはyieldよろしく妙なコードを生成した気がするし
.NET 4考慮でSynchronizationContext捏ねる方が好きだけどね
2018/11/06(火) 18:04:31.43ID:YGMwXXKod
>>372
何がどう難しすぎるの?
376デフォルトの名無しさん (ワッチョイ caeb-ZA70)
垢版 |
2018/11/06(火) 18:14:27.73ID:BgqxGxaf0
すまんが、あるクラスがインスタンス化された際、そのクラスのコンストラクターでインスタンス化した元のオブジェクトorクラスを取得することってできないの?
デバッグに使いたいんで引数で渡すのはなしでたのむ
2018/11/06(火) 18:41:26.83ID:YGMwXXKod
>>376
日本語で頼む
2018/11/06(火) 18:45:38.66ID:tGae1nmw0
>>376
インスタンスは正攻法だと無理そうな気配がする
呼び出し元のメソッドが定義されているクラスは
new StackFrame(1).GetMethod().DeclaringType
2018/11/06(火) 19:01:18.64ID:ySONZz/l0
象徴天皇制の現代で国民の意見を象徴しなかったらそら叩かれるだろw
2018/11/06(火) 19:01:53.71ID:ySONZz/l0
誤爆だすまん
2018/11/06(火) 19:29:28.47ID:KNaAB8gP0
あれ?難しいと思っているの俺だけ?

>>375
下の場合、基本 処理1=>test()=>処理2と逐次処理する。
test()のとこでawaitしているにもかかわらず、すぐにTestAsnc()は終了しちゃうとこ
test()で止まっているのに、値も設定されず次の処理にいくとか、動作が見た目と違い過ぎる

main(){
int ret = TestAsync();
}
async Task<int> TestAsync() {
処理1;
int ret=await test();
処理2;
return ret;
}
int test() {
24時間かかる処理;
}
2018/11/06(火) 19:44:02.97ID:KNaAB8gP0
>>375
◆async void は使うな
投げっぱなしは、なんでダメやねん

◆理由は分かったけど、Waitと混ぜるとデッドロックするとこ
 シングルスレッド止めたら、戻ったら動かないのは理解出来る
でも、async/awaitってTaskクラスを元にしてるんでしょ。
だったら、似たような動作をしてくれるもんだと…

◆SynchronizationContextとは何者?
UI処理に使うのはわかった。でも、これってその為だけ?


でも、一番の理由は、背景を含めてきちんと解説しているHPあるいは書籍が欲しいかな
2018/11/06(火) 19:47:29.55ID:bqFqbezi0
testがTaskになってない
2018/11/06(火) 19:53:25.35ID:HIVoSst90
>>381
mainメソッド自体が非同期じゃねーだろそれ
2018/11/06(火) 20:04:46.85ID:X+2KbTG8r
awaitって日本語に直すと「あ待て」なの?
2018/11/06(火) 20:16:58.70ID:KZ0uzBLfa
>>382
未確認飛行 Cの本サイトやブログが詳しい、例えばこれ
https://ufcpp.wordpress.com/2012/11/12/asyncawait%E3%81%A8%E5%90%8C%E6%99%82%E5%AE%9F%E8%A1%8C%E5%88%B6%E5%BE%A1/

async voidを避けるべき理由は http://neue.cc/2013/10/10_429.html を見てくれ
awaitとWaitを混ぜるとデッドロックするのはSynchronizationContextが関係していて
awaitするTaskの終了後は、awaitする前のスレッドで続きの処理をしようとするのが理由(ConfigureAwait使えば別のスレッドで続きの処理をする)
WaitはTaskが終了するまでそのスレッドで何もできなくなるから、awaitの「続きの処理をしようとする」ことが出来ずにデッドロックする
それで件のSynchronizationContextは、UI処理で使うためのものと思えばいいと思う
Webサーバー側でも同期コンテキストの概念があるらしいがよく知らない

>>385
https://ufcpp.net/blog/2018/1/await/
2018/11/06(火) 20:22:22.86ID:hiXG5OoB0
>>381,382
await/asyncが簡単だとは俺も思わんが初っ端からタイポってレベルじゃないコードが出てくると
「わかった」と言ってる部分すら疑ってかかってしまう

> ◆async void は使うな
わざわざ特別に許可されている構文であり使うなってことはない
使うべきではない場面で手抜きの為に採用するな、という文脈なら理解できる

> ◆理由は分かったけど、Waitと混ぜるとデッドロックするとこ
ConfigureAwaitまわりについては確かに直感に反する場合が多々あるが
結局のところをどちらを既定にするべきかという話になる

> ◆SynchronizationContextとは何者?
UI処理に使うのはただの一例。await(に限った話でもないが)の継続する処理を
どこでに実行するのかカスタマイズするために自分で実装することもできる
2018/11/06(火) 20:24:08.32ID:M0pxYueSp
非同期処理はここが分かりやすかった
https://www.kekyo.net/2016/12/06/6186
2018/11/06(火) 20:39:00.29ID:Irg6T2PQa
>>381
落とし穴が存在する、という意味で難しいのは確か。
非同期メソッドに限らず非同期処理は全部そうだけど

>動作が見た目と違い過ぎる
これは勘違い。
testの終了を(非同期的に)待機して終了したら下の行を継続するんだから
むしろ見た目通りでしょ。

そこでメソッドを抜けてるわけじゃない。
ただスレッドの占有を止めるだけ
2018/11/06(火) 20:54:24.19ID:KNaAB8gP0
>>387
>await/asyncが簡単だとは俺も思わんが初っ端からタイポってレベルじゃないコードが出てくると
どういうこと?
ちなみに、俺はmain中のint ret = TestAsync();はコンパイラーエラーを期待していた。
普通に実行できるうえに、test ()を待たずして、TestAsync()が終了するのに
びっくりしたけど、そういう動作なんでしょ?だから分からないと

>>389
>そこでメソッドを抜けてるわけじゃない。ただスレッドの占有を止めるだけ
でも、test()が終了していないのにTestAsync()が終了するのはなぜ?
retにはTask<int>型が入って、Result未設定になってるけど。
391デフォルトの名無しさん (アウアウウー Sac7-eilh)
垢版 |
2018/11/06(火) 21:02:02.39ID:KZ0uzBLfa
>>390
試したコードを貼ってくれないか?
皆が >>381 の書き込みを見て想像したコードは
https://ideone.com/gVD0Ob こんなのだと思うけど
ご覧の通りTask<int>からintには変換できないし、intはawait出来ない
2018/11/06(火) 21:05:03.24ID:KNaAB8gP0
>>388
他の人が出してきたのは、既にざくっとだけど読んでたものだったけど
これはみてなかった。後ほど見てみる。
2018/11/06(火) 21:06:23.76ID:QbvaQ8DKa
初心者には難しというか誰に対しても理念をしっかり理解しないと使えないし
それでも誤用してる人も多い
スレッドの流れもわからないでいろいろバグコード作ってて後で思ったように動かなくなる

それよりもTaskを使ったシグネチャーで一貫性が損なわれてるのが気持ち悪い
あとから出てきた言語などではasync awaitはきれいになってたりする

それまでが暗黒だったのですこし明るくなっただけでもすごく進歩してると思い込んでる
2018/11/06(火) 21:11:19.20ID:QbvaQ8DKa
awaitは一次的に呼び出し元へ順繰りにreturnするもの
2018/11/06(火) 21:16:42.51ID:QbvaQ8DKa
kekyoの丼は昔昔async/awaitでおかしな記事を書いてたな
MVPなのにこの程度の理解なのかと思った
2018/11/06(火) 21:17:05.17ID:J1JRrSzC0
@座標A(50,50)
 座標B(100,50)
 にABを結ぶ下半分の半円。

A座標C(100,50)
 座標D(50,50)
 にCDを結ぶ上半分の半円

まず、正方形の左上、右下の座標をangleに入れ
@angle=(50,25,100,75)
Aangle=(50,25,100,75)

@DrawArc(Pen, angle, -180, -180);
ADrawArc(Pen, angle, -180, 180);
これで合ってます?

よく解らない点
angle座標の計算式
半円の角度の意味がいまいち分からないです。
2018/11/06(火) 21:17:13.88ID:KNaAB8gP0
>>391
>試したコードを貼ってくれないか?
長いソースなんでそれは無理だけど

単純に簡略化したつもりだったんだけど
実際にはmain()でなくGUI
Task<int>ではなく、Task<bool>本質的には変えてないつもりだったんだけど…

悪いけど
ちょっと、時間もらって 明日に仕切り直しということで
2018/11/06(火) 21:31:56.37ID:8KRwrCef0
>>396
>angle座標の計算式
何の計算式が欲しいのかよくわからない。angle=四角に内接する楕円がベースになる
ここを参照
https://dobon.net/vb/dotnet/graphics/drawrectangle.html
ここだとRectAngleの座標をそのまま入れているけど意味は変わらない
水平方向右が角度開始位置
実行できる環境が無いのでなければ数値変えて自分で動かしてみる方が早く理解できる
2018/11/06(火) 21:42:34.61ID:pbTvUYL60
>>396
c#と何が関係あるの?
2018/11/06(火) 21:44:58.51ID:ahLHh+wMd
>>397
お前のコードだとawaitもTaskも全く基本的な使い方すらできてないやろ
少しはドキュメント読めよ
2018/11/06(火) 21:44:59.53ID:QbvaQ8DKa
ボタン押したらクリックイベントハンドラ(メソッド)で重い処理をしてGUIが固まってしまう
これを何とかするにはGUIに制御を返してやらないといけない

awaitではasyncメソッドの中のどこかのレベルで新しいTaskを作って
そっちで別の処理をさせて上のメソッドに制御を戻すことができる

必ずではないけどawaitに出会ったらスレッドは結果としてそのメソッドを離脱して
上位のコードを実行する

awaitに出会ったらスレッドは処理が終わるのを待ってはいない!(重要)
この場合はGUIに制御が戻ってる
awaitの戻り値が用意できたら良きタイミングでまたGUIから処理(スレッド)をかっぱらって続きを実行させるだけ!
2018/11/06(火) 21:48:32.21ID:QbvaQ8DKa
昔?はmainでawaitできなかった

一次的にでもmainを抜けると言うことはプログラム終了だもの
2018/11/06(火) 21:48:56.89ID:Irg6T2PQa
>>396
(1) まず最終的に描きたいパイをパイに切り取る前の全体の円(楕円)を考えて、
(2) その円(楕円)に外接する長方形を考える

こういう順番だと思うよ

DrawArcが引数に要求するのはその外接する長方形と、時計の3時からの開始位置の角度と
パイの角度だと思う

使ったことはないがw
2018/11/06(火) 21:56:24.33ID:QbvaQ8DKa
以下はよく見かける間違い

awaitに出会ったらGUIに処理を渡します
awaitに出会ったらそこで待機して結果が出るのを待ちます
2018/11/06(火) 22:26:22.46ID:KNaAB8gP0
作ったんで、書き込もうとするんだけど 書き込めない
HTTP 403 Forbiddened が出る。
2018/11/06(火) 22:37:57.23ID:KNaAB8gP0
これって、まじなソースコードって書けないの?
全角に変換してみた

        public Form1()
        {
            InitializeComponent();
            this.AllowDrop = true;
            wtest();

        }
        void wtest()
        {
            var ret=TestAsync();
            System.Diagnostics.Debug.WriteLine(ret.ToString());
        }

        async Task<bool> TestAsync()
        {
            bool ret = false;
            var task = Task.Run(() => {
                System.Threading.Thread.Sleep(10 * 1000);
                ret = true;
                });
            await task;
            
            return ret;
        }
2018/11/06(火) 22:39:33.41ID:KNaAB8gP0
半角に変換して試してw

試したのは、GUIなのでFormアプリで作ってみた
で、疑問点は、
1.これがそのまま動くこと。var ret=TestAsync();でコンパイラーエラーの方が納得する
  理由は、retに値が設定出来ないから。そのうえでTestAsync()呼び出しにawaitを強制するとか
2.await taskでTestAsnc()で待ちが入ると、その上位のメソッドの処理に流れが移ること

要するに流れが直観的でないと感じる。ただし、この流れはがTestAsyncがasync voidならまだ納得がいく
2018/11/06(火) 22:49:42.00ID:jcRa2hVA0
>>406
>>1にリンク張ってあるideoneかdotnetfiddle使いなよ
簡単なコードならサイト上で実行まで出来るぞ
2018/11/06(火) 22:54:04.17ID:QbvaQ8DKa
1.
var ret=TestAsync();でコンパイラーエラーがでるとtaskをそのまま受けたい場合に困る
retはただのTask<bool>であってそいつのResultじゃないからそれでいいだろう

2.
そういう流れで処理をしたいのでawaitを使ってる
それが疑問に思うならスタートがまちがってる
2018/11/06(火) 22:54:57.62ID:KNaAB8gP0
これでいいのかな?
https://dotnetfiddle.net/o7udF7

>>408
Thx
2018/11/06(火) 22:54:58.69ID:tGae1nmw0
>>407
asyncメソッドと言っても戻り値は単なるTask<bool>だし
Taskにawaitが強制されたらTaskを待つ場所を選べなくなる

動作的に言えばawaitした時点で抜けて後に再開しようとする
ILSpy 3.0.1とかでasync/awaitデコンパイルを無効にして
ビルド後のバイナリからメソッド内容を見てみるといい

まずTask.ContinueWith()+TaskScheduler.FromCurrentSynchronizationContext()とか
従来の書き方を学んだ方が良いと思う、コルーチン的な物の前に
2018/11/06(火) 22:55:30.26ID:LW+aJyL/0
varについてすら理解できてないじゃん
なんで406でのvarが381でintに置き換えられるって思ったの?
2018/11/06(火) 22:57:50.35ID:QbvaQ8DKa
重い処理Aをやってる最中にBもやりたいのでawait asyncを使ってる

重い処理Aの次にCをやるのとBが実行されるのを混同してはいけない
2018/11/06(火) 22:58:30.18ID:hiXG5OoB0
全 角 に 変 換 し て み た


やべえコイツ思っていた以上に馬鹿だぞ!!!

int に変換できるとか言ってたらvarで受けてるし面白すぎんだろ
2018/11/06(火) 23:01:12.62ID:QbvaQ8DKa
初心者あおりみっともない
しかも前のレスは初心者には理解できないだろ
2018/11/06(火) 23:01:39.73ID:KNaAB8gP0
>>409
おおっ 多分これが答えだな
納得はしていないけど、納得しやすい答えかな

例えば、2については、>>404
>awaitに出会ったらそこで待機して結果が出るのを待ちます
という受け取り方もあるけど、なぜ
>それが疑問に思うならスタートがまちがってる
のかな?

で、この考え方に到達するに参考する書籍等は?
2018/11/06(火) 23:04:27.04ID:QbvaQ8DKa
>>416
いつも新刊の入門書をざっと見てるけど入門書でまともにawait asyncを扱ってる書籍はないよ
あってもごまかしてあるか間違ってる
2018/11/06(火) 23:07:21.50ID:QbvaQ8DKa
重い処理Aをタスクでやって同時にメインのスレッドを実行し続けるのが目的なので
上位のメソッドが引き続き実行されるのが期待の動作

awaitされた重い処理Aの続きのCが実行されるのはまた別の話
2018/11/06(火) 23:13:59.85ID:QbvaQ8DKa
1. 順番に処理をやってるけど別の処理も同時にやりたいな A B
2. その処理が終わったらそのタイミングで別の処理をやりたいな A → C
というのを書くのが従来の非同期処理だと面倒なのでawait asyncを使ってる
2018/11/06(火) 23:21:04.01ID:QbvaQ8DKa
上の2は従来だとコールバックメソッドだったが
今はawaitより下の行のこと

従来だと処理が終わったらコールバックメソッドを実行する
awaitだと処理が終わるまで待つ

やってることは同じでも概念が変わって見える

でもやっぱり待つと言うのと違うんだよなあ
2018/11/06(火) 23:26:37.38ID:KNaAB8gP0
ありがとう  真面目に答えてくれた人w

差しあたって、消化しきれていないけど
なんとなく見えてきたので、よく考えてみまーす

>>420
うん。awaitって、2つの意味があるんだよね。
  非同期で実行する + ここで同期する(戻り値設定とか)
でも、そこが分かりづらい
でさらに、呼び出し元のスレッドは動く だから、呼び出し元の関数が動くということなんだろうけど
2018/11/06(火) 23:26:58.31ID:QbvaQ8DKa
Aを待ったあとにCをやってほしいのに先にBが実行されてしまう
これはけしからん!

というのはスタートが間違い

AとB同時にやってるけど非同期処理Aが終わったらCをやってほしいが正解
2018/11/06(火) 23:30:08.92ID:jcRa2hVA0
>>406
> var ret =TestAsync();
retにTestAsync()が返すbool値が入って欲しいなら、
var ret = await TestAsync();
2018/11/06(火) 23:37:32.97ID:QbvaQ8DKa
awaitではどのスレッドも待ってない

元のスレッドは呼び出し元の続きを実行し続ける
新しいtaskスレッドは実行し続ける

勝手に第三のスレッドができて待機したりしない
2018/11/06(火) 23:49:27.64ID:jcRa2hVA0
await Task.Run( () => { 処理A } );
処理B
とあったら、
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
var task = Task.Run( () => {処理A} );
task.ContinueWith( (t) => {処理B}, scheduler );
みたいに置き換わる。実際はもっと複雑だけど。
2018/11/06(火) 23:51:27.64ID:LW+aJyL/0
これでMSは何目指したの?なんて煽りするほどの相手に初心者煽りと言われてもなーって感じする
そもそもソフトウェア技術でハマりやすいスレッド周りをかなり触りやすく提供してくれてる技術だと思うし、その点でMSに苦情なんて出る?
2018/11/06(火) 23:56:24.75ID:QbvaQ8DKa
さっきも書いたけど美しくないしわかりづらいんじゃないの?

数年前はもっと理解してる人が少なかった
リアルで合う人の9割ぐらいの人は誤解してたかわからないと言ってた

ググって上位に出てくるいくつかのサイトも間違いを助長するような内容ばかりだったので
誤解するのも仕方ないかなって思ったなあ
2018/11/07(水) 00:01:47.29ID:qsaRvVqe0
>>424
なるほど 最初は、async/awaitの発想って非同期処理を同期処理のように見せることだと思ってた。
(結局これが正解なのね)

Webを漁っても、元々の動機からずれていくような気がしてたんだけど、
awaitで非同期処理を挟むけど同期処理をしているものと思えば、
当初の動機との整合性は取れる。
で、async/awaitの関数は(TestAsync)と書いたものは非同期なのだから
当然呼び出し元は、そのまま動いていくと。

これで、自分の中では大きなとこの整合性はとれたのかな
2018/11/07(水) 00:02:18.96ID:dWNwSiW+a
>>426
それは煽ってるわけじゃなくて、純粋にそう疑問に感じただけでしょうw
少なくとも他人を批判的に見る程度には自分自身も批判的に見た方がいいと思うよw
2018/11/07(水) 00:20:23.00ID:qsaRvVqe0
>>425
BackgroundWorkerからasnc/awaitに飛んだから
Taskすらまともに理解していなんだけど、

TaskSchedulerとSynchronizationContextはキーワードとし覚えてる
レベルアップするために、そこを解説したものを教えてください。
2018/11/07(水) 00:35:56.72ID:+978RLDn0
>>406-407
cmd.exe とか、特定の命令を半角で書くと、5ch は受け付けない。
ちょっとした英単語の書き込みでハッキングされるとか、5ch の運営は、アホなんだろう

Mango 板で、単語の絞り込みのテストができる

例えば、ドットなら、💩e みたいな文字参照を使えば、書き込める

cmd💩eexe
2018/11/07(水) 00:38:25.44ID:T3rtNmkK0
>>424
a「wait」って名前が誤解招いている感じ
2018/11/07(水) 00:40:03.17ID:+978RLDn0
16進数の2e は間違い。ウンコが表示されたw

例えば、ドットなら、10進数の. みたいな文字参照を使えば、書き込める

cmd.exe
2018/11/07(水) 00:41:05.63ID:NkMDfY750
>>429
俺も純粋にvarの理解すら怪しいのにasync周りが難しいってそんなもんじゃないかな?って思っただけなんすけどね
別に批判的に見てるつもりはなくて俺もasync周りは難しいと思ってる
2018/11/07(水) 01:11:44.95ID:qsaRvVqe0
>>434
>俺も純粋にvarの理解すら怪しいのに
逆に聞くと、varってどう誤解するの?もっとも俺はvarを誤解してるかもしれないけどw

余計誤解されるかもしれないとおもって書かなかったけど
解説しておくとすると、そこはシンタックスシュガーだと思ってた Task.Resultを返す
だから、上のほうで、本来ならコンパイラーエラーを出すべきだと書いたのも そこら辺の理由
他の人も指摘してるけど、そこはawaitを書くべきだと自分も書いたのも、あるべき姿はそっちだろうと思ってたから

実際には、動かした段階で、Task<bool>なのは知ってたんだけど そこで気づくべきだった。
とは思うけど、誤解する心理とはそういうものだと思う。

ちなみに、本当にasync/awaitで知りたいのは モナドとの関わりあい
F#ではコンピュテーション式で、async/awaitが実装されてるらしいんだけど
どう実装されているのかが知りたい。
2018/11/07(水) 01:29:03.21ID:NkMDfY750
>>435
まずvarはシンタックスシュガーじゃないよ
メソッドの戻り型を自分で定義してるのになんでTask外れると思ったの?
定義した型と違う型が返ってくるなんて言語仕様そのものからかわっちゃうじゃない
asyncなんか関係なくTask<bool>型を返すメソッドを作って、その戻り値をbool型に入れるって、あれ?ってなるよね

どんな環境でテストしてるのかわからんけどVSとかIDEならvarの上にマウスオーバーすれば型教えてくれるよ?
2018/11/07(水) 01:42:24.43ID:qsaRvVqe0
>>436
>まずvarはシンタックスシュガーじゃないよ
というのは、どこで判断するの?
シンタックスシュガーか否かなんての 言語仕様以外の判断基準って存在するの?
delegate、匿名メソッド、ラムダ式周りなんて、旧バージョンでは許されなかった
代入が普通に許されてなかったっけ?
疑問に思った全てを、MSDNで確認するわけではないよね。

>定義した型と違う型が返ってくるなんて言語仕様そのものからかわっちゃうじゃない
いやvarだから定義すらしてないし、脳内変換では、boolだと思い込んでるから

>どんな環境でテストしてるのかわからんけどVSとかIDEならvarの上にマウスオーバーすれば型教えてくれるよ?
だから、テストした段階で、気づいていると>>435にも書いたんだけど これは、今回の一連の質問以前に知ってた
実際には、retに何が入るのかは気になるからローカルウォッチで見た
だから、コンパイルエラーの方が本来の姿だと思ってたけど…
2018/11/07(水) 01:50:14.49ID:Z88Q6V1f0
>>436
XMLDocumentにかざしたけど出ないね
2018/11/07(水) 01:50:48.17ID:Nx5407ci0
具体的にはどの行がコンパイルエラーになるべきだと思ってる?
2018/11/07(水) 02:07:33.40ID:NkMDfY750
>>437
>async Task<int> TestAsync()
TestAsyncメソッドの戻り値をTask<int>型と定義したのは君だよ?
varは右辺から型を推論する、メソッドが○○型を返しますって定義されてるからその型になる
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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