回答編集履歴

1

意味不明な記述を修正

2016/02/18 08:01

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -2,12 +2,30 @@
2
2
 
3
3
 
4
4
 
5
- 関数(b)メイン・スレッドで実行していると思い
5
+ (少し意味不明な記述をしてましたので、修正しました
6
6
 
7
+
8
+
9
+ 関数(a)で時間がかかる処理を行うので、その実行中にユーザ入力に応答して関数(b)を実行したいのですね。
10
+
7
- サブ・スレッドを生成して関数(a)を実行させることで対応することが一般的です。
11
+ そのような時はサブ・スレッドを生成して関数(a)を実行させることで対応することが一般的です。
8
12
 
9
13
  でも、マルチスレッド・プログラミングは本当に難しいです。
10
14
 
11
15
  [ここ](http://www.atmarkit.co.jp/ait/subtop/features/dotnet/app/masterasync_index.html)は基本から説明してあり良さそうですよ。
12
16
 
13
17
  理解するのはたいへんですが、プログラマとして身につけると非常に有用な技術です。頑張って下さい。
18
+
19
+
20
+
21
+ ---
22
+
23
+ 【補足】
24
+
25
+ async/awaitはサブ・スレッドを容易に使えるようにする仕組みですが、サブ・スレッドを使用すると言う事実は変わりません。([その事実を明確にしないまま書かれている記事](http://qiita.com/Temarin_PITA/items/ff74d39ae1cfed89d1c5)もあるのでご用心。)
26
+
27
+
28
+
29
+ GUIコントロールは一般に[スレッドセーフ](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%82%BB%E3%83%BC%E3%83%95)ではないので、例えば関数(a)をawaitで実行した場合、サブ・スレッドで実行されます。そして、その関数(a)から戻る時にawaitによりメイン・スレッドへ同期されるため、戻った後ならGUIコントロールを変更できます。(昔のInvokeを使う方法に比べると本当に楽になってます。)しかし、関数(a)の中では通常GUIコントロールを変更してはいけませんのでご注意下さいね。
30
+
31
+ (もちろん、GUIコントロールだけでなく、スレッドセーフでない全てのリソースについて要注意です。)