当我的队列有东西要处理时如何触发后台线程

问题描述 投票:0回答:2

我正在使用 ConcurrentQueue 来存储来自多个线程的消息。

如何创建一些后台线程,当我的队列中有东西时会自动触发?

c# multithreading producer-consumer concurrent-queue
2个回答
0
投票

您可以启动一个带有 Thread.Sleep() 的工作线程,并在睡眠后询问您的队列计数是否> 0。

您可以将线程初始化代码放在类的构造函数或初始化方法中。

    ...
    var queue = new ConcurrentQueue<T>(); //Use your generic type for T
    var thread = new Thread(() => WorkOnQueue(queue));

    thread.IsBackground = true;
    thread.Name = "My Worker Thread";
    thread.Start();
    ...


    private void WorkOnQueue(ConcurrentQueue queue)
    {   
        var pause = TimeSpan.FromSeconds(0.05);
        while (!abort) // some criteria to abort or even true works here
        {
            if (queue.Count == 0)
            {
                // no pending actions available. pause
                Thread.Sleep(pause);
                continue;
            }

            DoWork(); //Contains the TryDequeue ...
        }
    }

0
投票

我们建议使用 SlimSemaphore 而不是忙等待。

因此,按照前面的示例:

 ...
var semaphore = new SlimSemaphore(0);
var queue = new ConcurrentQueue<T>(); //Use your generic type for T
var thread = new Thread(() => WorkOnQueue(queue));

thread.Start();
...
queue.Enqueue(...);
semaphore.Release();
...


private void WorkOnQueue(ConcurrentQueue queue)
{   
    while (!abort) // some criteria to abort or even true works here
    {
        semaphore.Wait();
        DoWork(); //Contains the TryDequeue ...
    }
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.