public void EnqueueTask(int[] task)
{
lock (_locker)
{
_taskQ.Enqueue(task);
Monitor.PulseAll(_locker);
}
}
所以,我在向队列中添加元素,然后线程对它们进行一些操作。如何异步地向队列添加项目?
public void EnqueueTask(int[] task)
{
lock (_locker)
{
_taskQ.Enqueue(task);
Monitor.PulseAll(_locker);
}
}
所以,我在向队列中添加元素,然后线程对它们进行一些操作。如何异步地向队列添加项目?
由于您正在使用Queue<T>(推荐),因此无法使用Queue.Synchronized。
但除此之外,我建议使用线程池。但是您的EnqueueTask方法有点暗示着线程逻辑是在“TaskQueue”类之外处理的(您的方法暗示它是任务队列)。
您的实现还暗示着我们不想在这里添加逻辑,而是在另一个地方,您那里的代码并不真正阻塞很长时间,所以我会颠倒一下事情。
它还意味着从队列中取出东西的东西已经在另一个线程上了,因为您使用“PulseAll”来唤醒该线程。
例如:
public void StartQueueHandler()
{
new Thread(()=>StartWorker).Start();
}
private int[] Dequeue()
{
lock(_locker)
{
while(_taskQ.Count == 0) Monitor.Wait(_locker);
return _taskQ.Dequeue();
}
}
private void StartWorker(object obj)
{
while(_keepProcessing)
{
//Handle thread abort or have another "shot down" mechanism.
int[] work = Dequeue();
//If work should be done in parallel without results.
ThreadPool.QueueUserWorkItem(obj => DoWork(work));
//If work should be done sequential according to the queue.
DoWork(work);
}
}
或许类似这样的代码可以实现:
void AddToQueue(Queue queue, string mess) {
var t = new Thread(() => Queue.Synchronized(queue).Enqueue(mess));
t.Start();
}
新线程确保当前线程不会被阻塞。
Queue.Syncronized 处理队列的所有锁定。 它可以替换为您的锁定代码,可能会获得更好的性能。
Queue<T>.Enqueue
后的Monitor.PulseAll
中做出这个观察。这是向出队线程发出信号的正常模式。因此,如果是这种情况,则最好的选择是使用.NET 4.0中提供的BlockingCollection
类。