質問編集履歴

2

タスク処理およびキャンセル関数について追記しました。

2016/08/05 04:08

投稿

matsu1
matsu1

スコア19

test CHANGED
File without changes
test CHANGED
@@ -34,11 +34,53 @@
34
34
 
35
35
  ###該当のソースコード
36
36
 
37
+ ----------------------------------- 処理の流れ -----------------------------------
38
+
39
+
40
+
41
+ 1.非同期タスクAが動作している状態で、フォームの閉じるボタンを押すとApp_FormClosing()が呼ばれる。
42
+
43
+ 2.タスクAが完了状態になってからフォームを閉じたいので、App_FormClosing()内でe.Cancel = true;
44
+
45
+ により一旦閉じる処理をキャンセルする。
46
+
47
+
48
+
49
+ 3.非同期タスクA:TaskA()は2s周期で何らかの処理を行っており、同時に
50
+
51
+ m_CTS.Token.IsCancellationRequestedによりタスクキャンセル命令が来ていないかチェックしている。
52
+
53
+
54
+
55
+ 4.UI側からCancelTaskA()により、タスクAをキャンセルする。
56
+
57
+ 直後にUI側ではキャンセル待ちタスクBを起動し、タスクAがキャンセルにより実行完了状態になるのを
58
+
37
- ※以下のCancelTaskA(),GetIsTaskACompleted()はコードは省略ます
59
+ GetIsTaskACompleted()でチェックながら待つ
60
+
61
+
62
+
38
-
63
+ 5.UI側からのキャンセル命令によりタスクAにて、m_CTS.Token.IsCancellationRequestedがtrueになり、
64
+
65
+ タスクAは実行完了する。
66
+
67
+
68
+
39
- それぞれ非同期タスクAキャンセルする,非同期タスクAが実行完したかを確認する関数です
69
+ 6.タスクAの実行完了により、キャンセル待ちタスクBも待ち終了する。
70
+
40
-
71
+ 7.e.Cancel = false;によりフォームを閉じる
72
+
73
+
74
+
41
-
75
+ ----------------------------------- UI側 -----------------------------------
76
+
77
+
78
+
79
+ /**
80
+
81
+ @brief 閉じるボタンを押すと呼ばれるイベントハンドラ
82
+
83
+ */
42
84
 
43
85
  async void App_FormClosing(object sender, FormClosingEventArgs e) {
44
86
 
@@ -50,35 +92,23 @@
50
92
 
51
93
  */
52
94
 
53
-
54
-
55
95
  e.Cancel = true;
56
96
 
57
97
  CancelTaskA();
58
98
 
59
99
 
60
100
 
61
- /* タスク完了フラグ確認タスク非同期で生成,起動する */
101
+ /* キャンセル待ちタスクBを起動する */
62
-
63
-
64
102
 
65
103
  await Task.Factory.StartNew(() => {
66
104
 
67
-
68
-
69
- /* キャンセル待ちタスクBを起動する */
70
-
71
-
72
-
73
105
  while (true) {
74
106
 
75
107
  Thread.Sleep(500);
76
108
 
77
109
 
78
110
 
79
- /* 非同期タスクAキャンセルにより実行完了の場合:break */
111
+ /* 非同期タスクAキャンセルにより実行完了すればキャンセル待ち終了 */
80
-
81
-
82
112
 
83
113
  if (GetIsTaskACompleted()) {
84
114
 
@@ -90,12 +120,94 @@
90
120
 
91
121
  });
92
122
 
123
+
124
+
125
+ /* フォームを閉じる */
126
+
93
127
  e.Cancel = false;
94
128
 
95
129
  }
96
130
 
97
131
 
98
132
 
133
+ ----------------------------------- 非同期タスクA側 -----------------------------------
134
+
135
+
136
+
137
+ /**
138
+
139
+ @brief 非同期タスクA用キャンセルトークンソース
140
+
141
+ */
142
+
143
+ private CancellationTokenSource m_CTS new CancellationTokenSource();
144
+
145
+
146
+
147
+ /**
148
+
149
+ @brief 非同期タスクA
150
+
151
+ */
152
+
153
+ private async Task TaskA()
154
+
155
+ {
156
+
157
+ await Task.Factory.StartNew(() => {
158
+
159
+ while (true) {
160
+
161
+ if (m_CTS.Token.IsCancellationRequested) {
162
+
163
+ break;
164
+
165
+ }
166
+
167
+ Thread.Sleep(2000);
168
+
169
+ 何らかの処理;
170
+
171
+ }
172
+
173
+ }, m_CTS.Token);
174
+
175
+ }
176
+
177
+
178
+
179
+ /**
180
+
181
+ @brief 非同期タスクAをキャンセルする
182
+
183
+ */
184
+
185
+ public void CancelAllTask()
186
+
187
+ {
188
+
189
+ m_CTS.Cancel();
190
+
191
+ }
192
+
193
+
194
+
195
+ /**
196
+
197
+ @brief 非同期タスクAが実行完了したかどうかを得る
198
+
199
+ */
200
+
201
+ public bool GetIsTaskACompleted()
202
+
203
+ {
204
+
205
+ return m_TaskA.IsCompleted;
206
+
207
+ }
208
+
209
+
210
+
99
211
  ###試したこと
100
212
 
101
213
  非同期タスクAはCancelTaskA()によりキャンセルされ、実行完了し、GetIsTaskACompleted()により

1

App_FormClosing\(\)の型など(async void)を追記しました。

2016/08/05 04:08

投稿

matsu1
matsu1

スコア19

test CHANGED
File without changes
test CHANGED
@@ -40,7 +40,7 @@
40
40
 
41
41
 
42
42
 
43
- App_FormClosing(object sender, FormClosingEventArgs e) {
43
+ async void App_FormClosing(object sender, FormClosingEventArgs e) {
44
44
 
45
45
 
46
46