【发布时间】:2017-03-13 08:54:57
【问题描述】:
我是使用 Blocking Collection 和线程的新手,我想确保我遵循最佳实践。我正在使用非线程安全的第三方 API。我将同时向 API 发出多个请求,因此我需要将这些请求添加到队列中并一个接一个地处理它们。为此,我有一个阻塞集合:
BlockingCollection<myEventArgs> myTasks = new BlockingCollection<myEventArgs>();
private void myEventHandler(object sender, myEventArgs e)
{
myTasks.Add(e);
}
private void doWork()
{
while (myTasks.IsCompleted == false)
{
//Do some work here with the third party API.
var eArgs = myTasks.Take();
//Sometimes I have a background (thread safe) task to perform.
//This is submitted to the thread pool.
Task.Run(() => doSomeBackgroundWork());
}
}
有时我会执行一个线程安全的后台任务。例如,API 调用是异步的,我需要轮询第三方系统以检查任务是否完成。我不希望这会阻止 BlockingCollection 处理下一个任务,所以我将它提交给线程池。一旦线程池任务完成,它将触发一个事件,该事件将一个新任务添加到 BlockingCollection。
此解决方案是否合适?是否有任何问题?我是否正确假设处理 BlockingCollection 中项目的 doWork 方法将始终在同一个线程中运行?而当我从线程池触发事件时,只有事件会在线程池上运行,而不是后续的doWork方法?
【问题讨论】:
-
我认为 DoWork() 需要一个循环,在它内部或周围。
-
是的,对不起,有一个循环,我只是解释了我的代码!为了清楚起见,我现在将其添加。
-
旁注,标准 C# 实践要求方法和类型使用 PascalCasing。
标签: c# multithreading thread-safety threadpool blockingcollection