私はマルチスレッドの概念に慣れていません。特定の数の文字列をキューに追加し、それらを複数のスレッドで処理する必要があります。スレッドセーフであるConcurrentQueue
を使用する。ConcurrentQueue with multithreading
これは私が試みたものです。ただし、並行キューに追加されたアイテムはすべて処理されません。最初の4項目のみが処理されます。
class Program
{
ConcurrentQueue<string> iQ = new ConcurrentQueue<string>();
static void Main(string[] args)
{
new Program().run();
}
void run()
{
int threadCount = 4;
Task[] workers = new Task[threadCount];
for (int i = 0; i < threadCount; ++i)
{
int workerId = i;
Task task = new Task(() => worker(workerId));
workers[i] = task;
task.Start();
}
for (int i = 0; i < 100; i++)
{
iQ.Enqueue("Item" + i);
}
Task.WaitAll(workers);
Console.WriteLine("Done.");
Console.ReadLine();
}
void worker(int workerId)
{
Console.WriteLine("Worker {0} is starting.", workerId);
string op;
if(iQ.TryDequeue(out op))
{
Console.WriteLine("Worker {0} is processing item {1}", workerId, op);
}
Console.WriteLine("Worker {0} is stopping.", workerId);
}
}
:
労働者が値をチェックします:あなたは、エンキューが行われた後
true
に設定されるブール変数を定義することができます。それは何か異なった仕組みですか? – waynemodzワーカーを開始すると、キューは空になります。 – CSharpie
その機能は[ActionBlock](https://msdn.microsoft.com/en-us/library/hh194684(v=vs.110).aspx)クラス –