在C#中具有受控任务关联的ThreadPool

时间:2015-02-10 07:59:44

标签: c# multithreading threadpool

您好我想拥有一个线程池类,它确保某些任务将在同一个线程中执行。看到这个简单的API: -

class ThreadPoolWithAffinity{
// All tasks with the same key should be queued to the same thread
  void EnqueueTask(Task t, Key k); 
}

是否有一些图书馆已经发明了“轮子”?

2 个答案:

答案 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()将新任务排入队列。