小编obi*_*111的帖子

在ActionBlock中等待异步lambda

我有一个带有ActionBlock的类Receiver:

public class Receiver<T> : IReceiver<T>
{

  private ActionBlock<T> _receiver;

  public Task<bool> Send(T item) 
  {
     if(_receiver!=null)
        return _receiver.SendAsync(item);

     //Do some other stuff her
  }

  public void Register (Func<T, Task> receiver)
  {
    _receiver = new ActionBlock<T> (receiver);
  }

  //...
}
Run Code Online (Sandbox Code Playgroud)

ActionBlock的Register-Action是一个带有await-Statement的async-Method:

private static async Task Writer(int num)
{
   Console.WriteLine("start " + num);
   await Task.Delay(500);
   Console.WriteLine("end " + num);
}
Run Code Online (Sandbox Code Playgroud)

现在我想做的是同步等待(如果设置了条件),直到action方法完成以获得独占行为:

var receiver = new Receiver<int>();
receiver.Register((Func<int, Task) Writer);
receiver.Send(5).Wait(); //does not wait the action-await here!
Run Code Online (Sandbox Code Playgroud)

问题是"await Task.Delay(500);" 语句被执行,"receiver.Post(5).Wait();" 不再等了.

我尝试了几种变体(TaskCompletionSource,ContinueWith,...),但它不起作用.

有谁知道如何解决这个问题?

c# asynchronous task-parallel-library async-await tpl-dataflow

6
推荐指数
1
解决办法
2969
查看次数