从多个线程等待任务

bav*_*aza 2 c# task

是否可以Wait()同时Task从两个不同的线程调用相同的线程?

例如,以下代码是否有效:

private BlockingCollection<Task> _queue = new BlockingCollection<Task>();
private Thread _taskPumpThread;
...
private void Run()
{
    _taskPumpThread= new Thread(() => TaskPump(...));
    _taskPumpThread.Start();

    DoNothing();
}

private void DoNothing()
{
    Task doNothing = new Task(() => Console.WriteLine("Doing nothing"));
    queue.Add(doNothing);
    doNothing.Wait(); // no try-catch for brevity
}

private void TaskPump(CancellationToken token)
{
    while (!token.IsCancellationRequested)
    {
         Task task = queue.Take();
         task.Start();
         task.Wait(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

动机:
我正在实现一个控制器,它最终将请求序列化到串口,并处理来自端口的通知.请求可以从不同的线程发送,它们应该能够等待结果(或异常),但可以选择异步工作.

我正在考虑上面的设计,因为它可以Task很好地处理所有情况(同步结果,异步调用和异常).

可在此处找到相关但不相同的问题.

sst*_*tan 6

我会限制自己回答你非常具体的问题.

如果您运行以下简短程序,您将看到答案是肯定的,您可以让多个线程等待同一任务:

public static void Main(string[] args)
{
    Task t = Task.Delay(10000);
    new Thread(() => { ThreadRun(t); }).Start();
    new Thread(() => { ThreadRun(t); }).Start();
    Console.WriteLine("Main thread exits"); // this prints immediately.
}

private static void ThreadRun(Task t)
{
    t.Wait();
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " finished waiting"); // this prints about 10 seconds later.
}
Run Code Online (Sandbox Code Playgroud)