您好我想拥有一个线程池类,它确保某些任务将在同一个线程中执行。看到这个简单的API: -
class ThreadPoolWithAffinity{
// All tasks with the same key should be queued to the same thread
void EnqueueTask(Task t, Key k);
}
是否有一些图书馆已经发明了“轮子”?
答案 0 :(得分:1)
假设您有多个Web客户端消费者,等待事件和 假设发送一个事件是你喜欢的相对较长的操作 通过创建发送ceratin事件的任务来并行完成 把它放到TP。为了保持事件的顺序,你需要所有这些 为将事件发送到某个客户端而创建的任务由 相同的线程
完全没有。只需在完成所有依赖项后启动任务即可。无需使用相同的线程。
假设您要使用以下依赖项生成请求A,B,C和D:
A and B independent
B after A
C after A and B
然后你写:
Task a = RequestAsync("A");
Task b = RequestAsync("B");
Task c = a.ContinueWith(_ => RequestAsync("C")).Unwrap();
Task d = Task.WhenAll(a, b).ContinueWith(_ => RequestAsync("D")).Unwrap();
现在已设置所有依赖项。您还可以动态添加工作。
您可以通过这种方式构建任意DAG。
答案 1 :(得分:0)
听起来像TPL就是你想要的,尤其是Task.ContinueWith
。例如:
var task1 = Task.Factory.StartNew(() =>
{
DoSomeLongComputation();
});
// This task will start as soon as the first is finished
task1.ContinueWith(task =>
{
DoAnotherLongComputation();
});
如果您构建了一个将任务分配给密钥的Dictionary<Key, Task>
,则可以使用ContinueWith()
将新任务排入队列。