回答編集履歴

5

修正

2018/10/18 04:36

投稿

Zuishin
Zuishin

スコア28656

test CHANGED
@@ -44,27 +44,33 @@
44
44
 
45
45
  {
46
46
 
47
- Something.DoSomething(async ct =>
47
+ for (int j = 0; j < 10; j++)
48
48
 
49
49
  {
50
50
 
51
- taskId++;
52
-
53
- for (int i = 0; i < 100; i++)
51
+ Something.DoSomething(async ct =>
54
52
 
55
53
  {
56
54
 
57
- if (ct.IsCancellationRequested) break;
55
+ taskId++;
58
56
 
59
- Debug.WriteLine($"{taskId}:{i}:1");
57
+ for (int i = 0; i < 100; i++)
60
58
 
61
- await Task.Delay(100);
59
+ {
62
60
 
63
- Debug.WriteLine($"{taskId}:{i}:2");
61
+ if (ct.IsCancellationRequested) break;
64
62
 
65
- }
63
+ Debug.WriteLine($"{taskId}:{i}:1");
66
64
 
65
+ await Task.Delay(100);
66
+
67
+ Debug.WriteLine($"{taskId}:{i}:2");
68
+
69
+ }
70
+
67
- });
71
+ });
72
+
73
+ }
68
74
 
69
75
  }
70
76
 
@@ -80,17 +86,27 @@
80
86
 
81
87
  static SemaphoreSlim semaphore = new SemaphoreSlim(1, 1);
82
88
 
89
+ static object lockObject = new object();
90
+
83
91
 
84
92
 
85
93
  public static Task DoSomething(Func<CancellationToken, Task> action)
86
94
 
87
95
  {
88
96
 
89
- Cancel();
97
+ CancellationToken token;
90
98
 
91
- cts = new CancellationTokenSource();
99
+ lock (lockObject)
92
100
 
101
+ {
102
+
103
+ Cancel();
104
+
105
+ cts = new CancellationTokenSource();
106
+
93
- var token = cts.Token;
107
+ token = cts.Token;
108
+
109
+ }
94
110
 
95
111
  return Task.Run(async () =>
96
112
 

4

修正

2018/10/18 04:36

投稿

Zuishin
Zuishin

スコア28656

test CHANGED
@@ -88,11 +88,13 @@
88
88
 
89
89
  Cancel();
90
90
 
91
+ cts = new CancellationTokenSource();
92
+
93
+ var token = cts.Token;
94
+
91
95
  return Task.Run(async () =>
92
96
 
93
97
  {
94
-
95
- cts = new CancellationTokenSource();
96
98
 
97
99
  await semaphore.WaitAsync();
98
100
 
@@ -100,7 +102,7 @@
100
102
 
101
103
  {
102
104
 
103
- await action(cts.Token);
105
+ await action(token);
104
106
 
105
107
  }
106
108
 

3

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

2018/10/16 12:41

投稿

Zuishin
Zuishin

スコア28656

test CHANGED
@@ -92,13 +92,13 @@
92
92
 
93
93
  {
94
94
 
95
+ cts = new CancellationTokenSource();
96
+
95
97
  await semaphore.WaitAsync();
96
98
 
97
99
  try
98
100
 
99
101
  {
100
-
101
- cts = new CancellationTokenSource();
102
102
 
103
103
  await action(cts.Token);
104
104
 

2

変更

2018/10/16 12:33

投稿

Zuishin
Zuishin

スコア28656

test CHANGED
@@ -1,4 +1,6 @@
1
1
  みなさんならどうしますかということなので、私なら別のクラスに分離します。
2
+
3
+ コメント欄にて指摘いただいたので書き直しました。
2
4
 
3
5
 
4
6
 
@@ -42,11 +44,11 @@
42
44
 
43
45
  {
44
46
 
45
- taskId++;
46
-
47
47
  Something.DoSomething(async ct =>
48
48
 
49
49
  {
50
+
51
+ taskId++;
50
52
 
51
53
  for (int i = 0; i < 100; i++)
52
54
 
@@ -54,9 +56,11 @@
54
56
 
55
57
  if (ct.IsCancellationRequested) break;
56
58
 
57
- Debug.WriteLine($"{taskId}:{i}");
59
+ Debug.WriteLine($"{taskId}:{i}:1");
58
60
 
59
61
  await Task.Delay(100);
62
+
63
+ Debug.WriteLine($"{taskId}:{i}:2");
60
64
 
61
65
  }
62
66
 
@@ -74,6 +78,8 @@
74
78
 
75
79
  static CancellationTokenSource cts;
76
80
 
81
+ static SemaphoreSlim semaphore = new SemaphoreSlim(1, 1);
82
+
77
83
 
78
84
 
79
85
  public static Task DoSomething(Func<CancellationToken, Task> action)
@@ -82,17 +88,27 @@
82
88
 
83
89
  Cancel();
84
90
 
85
- return Task.Run(() =>
91
+ return Task.Run(async () =>
86
92
 
87
93
  {
88
94
 
89
- using (var semaphore = new Semaphore(0, 1))
95
+ await semaphore.WaitAsync();
96
+
97
+ try
90
98
 
91
99
  {
92
100
 
93
101
  cts = new CancellationTokenSource();
94
102
 
95
- action(cts.Token).GetAwaiter().GetResult();
103
+ await action(cts.Token);
104
+
105
+ }
106
+
107
+ finally
108
+
109
+ {
110
+
111
+ semaphore.Release();
96
112
 
97
113
  }
98
114
 

1

using を使う

2018/10/16 11:34

投稿

Zuishin
Zuishin

スコア28656

test CHANGED
@@ -86,23 +86,13 @@
86
86
 
87
87
  {
88
88
 
89
- var semaphore = new Semaphore(0, 1);
89
+ using (var semaphore = new Semaphore(0, 1))
90
-
91
- try
92
90
 
93
91
  {
94
92
 
95
93
  cts = new CancellationTokenSource();
96
94
 
97
95
  action(cts.Token).GetAwaiter().GetResult();
98
-
99
- }
100
-
101
- finally
102
-
103
- {
104
-
105
- semaphore.Release();
106
96
 
107
97
  }
108
98