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

回答編集履歴

5

修正

2018/10/18 04:36

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -21,17 +21,20 @@
21
21
 
22
22
  private void button1_Click(object sender, EventArgs e)
23
23
  {
24
- Something.DoSomething(async ct =>
24
+ for (int j = 0; j < 10; j++)
25
25
  {
26
- taskId++;
27
- for (int i = 0; i < 100; i++)
26
+ Something.DoSomething(async ct =>
28
27
  {
28
+ taskId++;
29
+ for (int i = 0; i < 100; i++)
30
+ {
29
- if (ct.IsCancellationRequested) break;
31
+ if (ct.IsCancellationRequested) break;
30
- Debug.WriteLine($"{taskId}:{i}:1");
32
+ Debug.WriteLine($"{taskId}:{i}:1");
31
- await Task.Delay(100);
33
+ await Task.Delay(100);
32
- Debug.WriteLine($"{taskId}:{i}:2");
34
+ Debug.WriteLine($"{taskId}:{i}:2");
33
- }
35
+ }
34
- });
36
+ });
37
+ }
35
38
  }
36
39
  }
37
40
 
@@ -39,12 +42,17 @@
39
42
  {
40
43
  static CancellationTokenSource cts;
41
44
  static SemaphoreSlim semaphore = new SemaphoreSlim(1, 1);
45
+ static object lockObject = new object();
42
46
 
43
47
  public static Task DoSomething(Func<CancellationToken, Task> action)
44
48
  {
49
+ CancellationToken token;
50
+ lock (lockObject)
51
+ {
45
- Cancel();
52
+ Cancel();
46
- cts = new CancellationTokenSource();
53
+ cts = new CancellationTokenSource();
47
- var token = cts.Token;
54
+ token = cts.Token;
55
+ }
48
56
  return Task.Run(async () =>
49
57
  {
50
58
  await semaphore.WaitAsync();

4

修正

2018/10/18 04:36

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -43,13 +43,14 @@
43
43
  public static Task DoSomething(Func<CancellationToken, Task> action)
44
44
  {
45
45
  Cancel();
46
+ cts = new CancellationTokenSource();
47
+ var token = cts.Token;
46
48
  return Task.Run(async () =>
47
49
  {
48
- cts = new CancellationTokenSource();
49
50
  await semaphore.WaitAsync();
50
51
  try
51
52
  {
52
- await action(cts.Token);
53
+ await action(token);
53
54
  }
54
55
  finally
55
56
  {

3

順番を間違えていたので修正

2018/10/16 12:41

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -45,10 +45,10 @@
45
45
  Cancel();
46
46
  return Task.Run(async () =>
47
47
  {
48
+ cts = new CancellationTokenSource();
48
49
  await semaphore.WaitAsync();
49
50
  try
50
51
  {
51
- cts = new CancellationTokenSource();
52
52
  await action(cts.Token);
53
53
  }
54
54
  finally

2

変更

2018/10/16 12:33

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -1,4 +1,5 @@
1
1
  みなさんならどうしますかということなので、私なら別のクラスに分離します。
2
+ コメント欄にて指摘いただいたので書き直しました。
2
3
 
3
4
  ```C#
4
5
  using System;
@@ -20,14 +21,15 @@
20
21
 
21
22
  private void button1_Click(object sender, EventArgs e)
22
23
  {
23
- taskId++;
24
24
  Something.DoSomething(async ct =>
25
25
  {
26
+ taskId++;
26
27
  for (int i = 0; i < 100; i++)
27
28
  {
28
29
  if (ct.IsCancellationRequested) break;
29
- Debug.WriteLine($"{taskId}:{i}");
30
+ Debug.WriteLine($"{taskId}:{i}:1");
30
31
  await Task.Delay(100);
32
+ Debug.WriteLine($"{taskId}:{i}:2");
31
33
  }
32
34
  });
33
35
  }
@@ -36,17 +38,23 @@
36
38
  static class Something
37
39
  {
38
40
  static CancellationTokenSource cts;
41
+ static SemaphoreSlim semaphore = new SemaphoreSlim(1, 1);
39
42
 
40
43
  public static Task DoSomething(Func<CancellationToken, Task> action)
41
44
  {
42
45
  Cancel();
43
- return Task.Run(() =>
46
+ return Task.Run(async () =>
44
47
  {
45
- using (var semaphore = new Semaphore(0, 1))
48
+ await semaphore.WaitAsync();
49
+ try
46
50
  {
47
51
  cts = new CancellationTokenSource();
48
- action(cts.Token).GetAwaiter().GetResult();
52
+ await action(cts.Token);
49
53
  }
54
+ finally
55
+ {
56
+ semaphore.Release();
57
+ }
50
58
  });
51
59
  }
52
60
 

1

using を使う

2018/10/16 11:34

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -42,16 +42,11 @@
42
42
  Cancel();
43
43
  return Task.Run(() =>
44
44
  {
45
- var semaphore = new Semaphore(0, 1);
45
+ using (var semaphore = new Semaphore(0, 1))
46
- try
47
46
  {
48
47
  cts = new CancellationTokenSource();
49
48
  action(cts.Token).GetAwaiter().GetResult();
50
49
  }
51
- finally
52
- {
53
- semaphore.Release();
54
- }
55
50
  });
56
51
  }
57
52