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

回答編集履歴

3

修正

2021/04/09 10:55

投稿

退会済みユーザー
answer CHANGED
@@ -41,7 +41,7 @@
41
41
  //キーを押すとTaskに仕事をさせるぞ!
42
42
  Console.ReadKey();
43
43
 
44
- _JobQueue.Enqueue(() => Console.WriteLine($"ManagedThreadId:{Thread.CurrentThread.ManagedThreadId} {_JobStartCount}回仕事をしました"));
44
+ _JobQueue.Enqueue(() => Console.WriteLine($"ManagedThreadId:{Thread.CurrentThread.ManagedThreadId} {_JobStartCount}回仕事をしました"));
45
45
  }
46
46
  }
47
47
  }

2

サンプル追記

2021/04/09 10:55

投稿

退会済みユーザー
answer CHANGED
@@ -1,2 +1,49 @@
1
1
  処理のキュー(Delegateでもいれとくとか)みたいなものを作って、その特定スレッドとやらで監視するしかないんじゃないですかね。
2
- InvokeはWindowメッセージ(PostMessage)を利用することでUIスレッドで動作させていますので、フォームを持たないスレッドでは、自前で仕組みを構築する必要があります。
2
+ InvokeはWindowメッセージ(PostMessage)を利用することでUIスレッドで動作させていますので、フォームを持たないスレッドでは、自前で仕組みを構築する必要があります。
3
+
4
+ 雰囲気を掴む程度の適当なサンプルを追記します。
5
+ ```C#
6
+ using System;
7
+ using System.Threading.Tasks;
8
+ using System.Collections.Concurrent;
9
+ using System.Threading;
10
+
11
+ namespace Test
12
+ {
13
+ class Program
14
+ {
15
+ static ConcurrentQueue<Action> _JobQueue = new ConcurrentQueue<Action>();
16
+ static Task _HogeTask;
17
+ static int _JobStartCount = 0;
18
+
19
+ static void Main(string[] args)
20
+ {
21
+ Console.WriteLine($"ManagedThreadId:{Thread.CurrentThread.ManagedThreadId} プログラムを開始しました。");
22
+ _HogeTask = Task.Run(() => {
23
+ Console.WriteLine($"ManagedThreadId:{Thread.CurrentThread.ManagedThreadId} Taskを開始しました。");
24
+ while (_JobStartCount<10 )
25
+ {
26
+ Action act;
27
+ if (_JobQueue.TryDequeue(out act))
28
+ {
29
+ _JobStartCount++;
30
+ act();
31
+ }
32
+
33
+ Thread.Sleep(1000);
34
+ }
35
+
36
+ Console.WriteLine($"ManagedThreadId:{Thread.CurrentThread.ManagedThreadId} {_JobStartCount}回仕事したのでもう帰ります");
37
+ });
38
+
39
+ while( !_HogeTask.IsCompleted )
40
+ {
41
+ //キーを押すとTaskに仕事をさせるぞ!
42
+ Console.ReadKey();
43
+
44
+ _JobQueue.Enqueue(() => Console.WriteLine($"ManagedThreadId:{Thread.CurrentThread.ManagedThreadId} {_JobStartCount}回仕事中をしました"));
45
+ }
46
+ }
47
+ }
48
+ }
49
+ ```

1

修正

2021/04/09 10:54

投稿

退会済みユーザー
answer CHANGED
@@ -1,1 +1,2 @@
1
- 処理のキュー(Delegateでもいれとくとか)みたいなものを作って、その特定スレッドとやらで監視するしかないんじゃないですかね。
1
+ 処理のキュー(Delegateでもいれとくとか)みたいなものを作って、その特定スレッドとやらで監視するしかないんじゃないですかね。
2
+ InvokeはWindowメッセージ(PostMessage)を利用することでUIスレッドで動作させていますので、フォームを持たないスレッドでは、自前で仕組みを構築する必要があります。