質問するログイン新規登録

回答編集履歴

7

聞きたいことを追加

2018/08/03 21:32

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -67,5 +67,9 @@
67
67
  **もし値を受け取ったことを判断する処理を呼び元(メインスレッド上)に作ってしまうと**
68
68
  **非同期処理の意味がなくなってしまいます。**
69
69
 
70
+ 必ずしもタイマー処理で値を受け取ったことを判断する必要はあるのでしょうか。
71
+ 例えば、値を受け取ったらイベントとして送ってあげて、
72
+ 別で処理してあげる…とか色々方法はあると思います。
73
+
70
- 現在の質問者様の意図を組み取る限りでは実装が難しいように思います。
74
+ とにかく、現在の質問者様の意図を組み取る限りでは実装が難しいように思います。
71
75
  何か誤解がありましたら教えてください。

6

一部引用削除

2018/08/03 21:32

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -64,12 +64,8 @@
64
64
 
65
65
  ######上記コードの問題点
66
66
  この実装だとメインスレッドはスレッドに処理を任せているだけなので
67
- > 非同期処理の中である値を取得するのですが、
68
- その値を受け取った時点で非同期処理自体は終了し、
69
- それが終わったことを呼び元の処理が判断できればと考えています。
70
-
71
- **値を受け取ったことを判断する処理を呼び元(メインスレッド上)に作ってしまうと**
67
+ **もし値を受け取ったことを判断する処理を呼び元(メインスレッド上)に作ってしまうと**
72
68
  **非同期処理の意味がなくなってしまいます。**
73
69
 
74
- 現在の質問者様の意図を組み取る実装が難しいと私は思います。
70
+ 現在の質問者様の意図を組み取る限りでは実装が難しいように思います。
75
71
  何か誤解がありましたら教えてください。

5

文言修正

2018/08/03 21:27

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -37,10 +37,9 @@
37
37
 
38
38
  この処理自体はメインスレッド以外のスレッドでやるべきです。
39
39
 
40
- つまり、画面を固めないようにするため、
41
- メインスレッドは処理を続行し非同期処理用のスレッドを2つ作成する必要があります。
40
+ **つまりメインスレッドは処理を続行し非同期処理用のスレッドを2つ作成する必要があります。**
42
41
 
43
- 念のためコードを添付します。
42
+ コードを添付します。
44
43
  コメント文の「★」は後述の問題点です。
45
44
 
46
45
 

4

メインスレッドの説明を修正

2018/08/03 21:23

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -26,7 +26,7 @@
26
26
  ######フォームが固まる理由について
27
27
  Waitを呼んだ処理がメインスレッドとして動いているのだと思います。
28
28
 
29
- メインスレッドは、画面の描画やユーザーの操作を受け取ったりするために動くスレッドです。
29
+ 画面の描画やユーザーの操作を受け取ったりするのはメインスレッドだけです。
30
30
  なので、もしメインスレッドをWaitしてしまった場合は画面が固まります。
31
31
  =**メインスレッドでSleepもWaitもしないこと**
32
32
 

3

追記した日付を追加

2018/08/03 21:21

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -22,15 +22,15 @@
22
22
  }
23
23
  }
24
24
  ```
25
- ##**追記**
25
+ #**追記(2018/08/04)**
26
- ###フォームが固まる理由について
26
+ ######フォームが固まる理由について
27
27
  Waitを呼んだ処理がメインスレッドとして動いているのだと思います。
28
28
 
29
29
  メインスレッドは、画面の描画やユーザーの操作を受け取ったりするために動くスレッドです。
30
30
  なので、もしメインスレッドをWaitしてしまった場合は画面が固まります。
31
31
  =**メインスレッドでSleepもWaitもしないこと**
32
32
 
33
- ###フォームが固まらないようにする方法
33
+ ######フォームが固まらないようにする方法
34
34
  フォームが止まらないように直すのであれば、
35
35
 
36
36
  > ある変数の値が変わるまで待つ処理
@@ -63,7 +63,7 @@
63
63
 
64
64
  ```
65
65
 
66
- ###上記コードの問題点
66
+ ######上記コードの問題点
67
67
  この実装だとメインスレッドはスレッドに処理を任せているだけなので
68
68
  > 非同期処理の中である値を取得するのですが、
69
69
  その値を受け取った時点で非同期処理自体は終了し、

2

コード修正

2018/08/03 21:19

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -52,7 +52,7 @@
52
52
   //ある変数の値が変わるまで待つ処理
53
53
  Task taskForWait = Task.Run( () => {
54
54
               Task t= Task.Run( () => {
55
- int
55
+ //やりたい処理
56
56
    } );
57
57
 
58
58
  t.Wait();

1

追記を追加

2018/08/03 21:17

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -21,4 +21,56 @@
21
21
  t.Wait();
22
22
  }
23
23
  }
24
- ```
24
+ ```
25
+ ##**追記**
26
+ ###フォームが固まる理由について
27
+ Waitを呼んだ処理がメインスレッドとして動いているのだと思います。
28
+
29
+ メインスレッドは、画面の描画やユーザーの操作を受け取ったりするために動くスレッドです。
30
+ なので、もしメインスレッドをWaitしてしまった場合は画面が固まります。
31
+ =**メインスレッドでSleepもWaitもしないこと**
32
+
33
+ ###フォームが固まらないようにする方法
34
+ フォームが止まらないように直すのであれば、
35
+
36
+ > ある変数の値が変わるまで待つ処理
37
+
38
+ この処理自体はメインスレッド以外のスレッドでやるべきです。
39
+
40
+ つまり、画面を固めないようにするため、
41
+ メインスレッドは処理を続行し非同期処理用のスレッドを2つ作成する必要があります。
42
+
43
+ 念のためコードを添付します。
44
+ コメント文の「★」は後述の問題点です。
45
+
46
+
47
+ ```C#
48
+ private void button1_Click(object sender, EventArgs e)
49
+ {
50
+ //ここでSleepしたらメインスレッドがSleepするので、画面が固まる
51
+ //Thread.Sleep(100);などしない
52
+  //ある変数の値が変わるまで待つ処理
53
+ Task taskForWait = Task.Run( () => {
54
+              Task t= Task.Run( () => {
55
+ int
56
+   } );
57
+
58
+ t.Wait();
59
+ //★どう通知するの?taskForWaitがtの終わりを知れればOK?
60
+ } );
61
+ //★ここで値を受け取ったことを判断する処理を呼び出すと画面固まるので非同期処理の意味がない
62
+ }
63
+
64
+ ```
65
+
66
+ ###上記コードの問題点
67
+ この実装だとメインスレッドはスレッドに処理を任せているだけなので
68
+ > 非同期処理の中である値を取得するのですが、
69
+ その値を受け取った時点で非同期処理自体は終了し、
70
+ それが終わったことを呼び元の処理が判断できればと考えています。
71
+
72
+ **値を受け取ったことを判断する処理を呼び元(メインスレッド上)に作ってしまうと**
73
+ **非同期処理の意味がなくなってしまいます。**
74
+
75
+ 現在の質問者様の意図を組み取ると実装が難しいと私は思います。
76
+ 何か誤解がありましたら教えてください。