9

forこれらの2つのメソッドをループでキューに入れているとしましょう

for (int i = 0; i < 100; i++)
{
    ThreadPool.QueueUserWorkItem(s =>
    {
        Console.WriteLine("Output");
        Thread.Sleep(1000);
    });
}

for (int i = 0; i < 100; i++)
{
    ThreadPool.QueueUserWorkItem(s =>
    {
        Console.WriteLine("Output2");
        Thread.Sleep(1000);
    });
}

出力するすべてのスレッドを停止し、その出力Console.WriteLine("Output2");を実行し続けるスレッドを維持する方法はありますConsole.WriteLine("Output");か?

4

2 に答える 2

18

CancellationTokenを使用できます。

for (int i = 0; i < 100; i++)
{
    ThreadPool.QueueUserWorkItem(s =>
    {
        Console.WriteLine("Output");
        Thread.Sleep(1000);
    });
}

CancellationTokenSource cts = new CancellationTokenSource();

for (int i = 0; i < 100; i++)
{
    ThreadPool.QueueUserWorkItem(s =>
    {
        CancellationToken token = (CancellationToken) s;
        if (token.IsCancellationRequested)
            return;
        Console.WriteLine("Output2");
        token.WaitHandle.WaitOne(1000);
    }, cts.Token);
}

cts.Cancel();
于 2012-11-27T18:08:52.690 に答える
2

いいえ、それはできません。あなたが長い行で何かをしたいなら、あなたはそれを管理するためにいくつかのコードを書かなければなりません。非常に基本的なレベルでは、次のようなものが必要です。

object syncObject = new object();
bool shouldOutput2 = true;
ThreadPool.QueueUserWorkItem(s =>
{
    lock(syncObject)
    {
        if(!shouldOutput2)
        {
           return;
        }
    }
    Console.WriteLine("Output2");
    Thread.Sleep(1000);
});

アイテムをキューに入れたら、残りのアイテムを実行しないように指示するためにフラグを設定できます。

   lock(syncObject)
   {
        shouldOutput2 = false;
   }

これは非常に汚い方法ですが、あなたの例では唯一の方法のようです。あなたが達成しようとしている実際の実際の行動についてもっと教えていただければ、もっと良い選択肢があるかもしれません。

于 2012-11-27T18:09:55.573 に答える