ふらっと 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/10/31(水) 21:31:50.61ID:GKybvSyw0
リンクってのがよく理解できていない
2018/10/31(水) 23:31:16.71ID:Q2P2Jyf/0
SQLはひらめくけど、リンクはひらめかない
2018/10/31(水) 23:45:42.03ID:kwqElk+D0
linqより理解しやすいメカニズムも無いと思うけど
323デフォルトの名無しさん (ワッチョイ afeb-o1DS)
垢版 |
2018/10/31(水) 23:51:55.59ID:lqvIUA6e0
ラムダ式を理解するのにデリゲートなんて要らねえのにな
一体どんな頭してんだ
2018/11/01(木) 04:47:03.77ID:7mP44JOI0
タイプセーフな関数ポインタやコールバック、匿名関数で説明してるけど

それで通じないと どこから説明すれば良いかたいへん

デリゲートからの説明はしんどい…
2018/11/01(木) 04:56:16.11ID:7mP44JOI0
>>319
Wikipediaにもいくつか乗ってるよ
2018/11/01(木) 07:48:57.67ID:PBz6MbCm0
Linq は、Java のStream、Ruby on Rails と同じ。
関数型

メソッドチェーンしていって、一番最後にレコードを取得する。
遅延実行

ずっと、フィルター・SQL 文だけを組み立てて、一番最後だけアクセスする
2018/11/01(木) 11:43:18.05ID:Ezzdmjted
>>323
元の質問が理解は出来るけど使い方がわからないって話だからな
FuncやActionか、メソッドのデリゲート引数ぐらいでしか使わないしあながち間違えてない
2018/11/01(木) 11:46:58.88ID:DtT8Cv0dM
デリゲートはイベントにも使うよ
そしてそれこそがデリゲートを理解しにくいものにしている最大の原因でもある
2018/11/01(木) 13:53:28.62ID:Ezzdmjted
ラムダ式を何処で使うかの話でデリゲートを何処で使うかについてはふれてないよ
デリゲートの使い道でいうと非同期実行するために使うとか色々ある

ラムダ式に関しては、FuncやActionかメソッドの引数ぐらいでしか使ってないと思うんだけど他になんかある?
2018/11/01(木) 14:16:07.14ID:aKMxEeDc0
ローカル関数がなかった時代のローカル関数代わり
2018/11/01(木) 18:07:39.71ID:0xRkJrzka
式木
2018/11/01(木) 18:49:47.61ID:ECytQ9s20
ラムダ式使ったのはfind関数のときくらいかな
それ以外ほぼ使ったことない
2018/11/02(金) 00:13:13.50ID:cBjseW3X0
ワシの波動球はラムダ式まであるぞ
334デフォルトの名無しさん (ワッチョイ f68a-ZA70)
垢版 |
2018/11/02(金) 03:44:16.47ID:hToiCYAd0
Postgresを、SQLiteみたいにDBファイルとコネクタだけで使うにはどうすればよいでしょうか?
335デフォルトの名無しさん (ワッチョイ caeb-ZA70)
垢版 |
2018/11/02(金) 13:32:10.56ID:1IoIYp5Z0
無理だろそりゃ
2018/11/02(金) 13:46:37.38ID:n/9UgDRl0
>>335
portable版使ったことないの?
337デフォルトの名無しさん (ワッチョイ caeb-ZA70)
垢版 |
2018/11/02(金) 13:51:48.43ID:1IoIYp5Z0
>>336
>コネクタだけ
って書いてるからどうにもなんないよ
2018/11/02(金) 13:55:23.85ID:n/9UgDRl0
>>337
なんで?
339デフォルトの名無しさん (ワッチョイ caeb-ZA70)
垢版 |
2018/11/02(金) 13:56:59.71ID:1IoIYp5Z0
>>338
じゃあ俺には無理だから、あんたが教えてあげたら良いんじゃないの
2018/11/02(金) 17:21:36.81ID:ouVO3wBCd
namespace Drawlinetest
{
public partial class Form1 : Form
{
PictureBox pbox = new PictureBox();
Point pt = new Point(-1, -1);
public Form1()
{
InitializeComponent();
pbox.Location = new Point(0, 0); pbox.Size = new Size(500, 500);
this.Controls.Add(pbox); this.ClientSize = pbox.Size;
pbox.Image = new Bitmap(pbox.Width, pbox.Height);
pbox.MouseDown += MD;
}
private void MD(object sender, MouseEventArgs e)
{
Point p = e.Location;
if (e.Clicks > 1) { pbox.Image = new Bitmap(pbox.Width, pbox.Height); return; }//ダブルクリックで画像リセット
int x = pbox.Width - 1, y = pbox.Height - 1;
if (pt.X < 0 || pt.X > x || pt.Y < 0 || pt.Y > y) { pt = p; return; }
Graphics g = Graphics.FromImage(pbox.Image);
g.DrawLine(Pens.Black, pt.X, pt.Y, p.X, p.Y);
pbox.Refresh(); g.Dispose(); pt = p;
}
}
}

前スレにあったのを参考に400角にピッチ20の方眼を作りました。
クリック時に近い点を取って連続線にしたい場合どうすればいいですか?
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を使ってる
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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