我有一个带有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);
}
//...
}
注册ActionBlock的Register-Action是一个带有await语句的异步方法:
private static async Task Writer(int num)
{
Console.WriteLine("start " + num);
await Task.Delay(500);
Console.WriteLine("end " + num);
}
现在我想要做的是同步等待(如果设置了一个条件)直到操作方法完成以获得独占行为:
var receiver = new Receiver<int>();
receiver.Register((Func<int, Task) Writer);
receiver.Send(5).Wait(); //does not wait the action-await here!
问题是当执行 "await Task.Delay(500);" 语句时,"receiver.Post(5).Wait();" 不再等待。我尝试了几种变体(TaskCompletionSource、ContinueWith 等),但都不起作用。有人有解决问题的想法吗?
_receiver
改成TransformBlock
,然后把以下操作放到一个新的ActionBlock
中,并将其链接到_receiver
? - svick