【发布时间】:2012-12-04 13:30:27
【问题描述】:
我有一个带有 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-Statement 的异步方法:
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!
问题在于“等待 Task.Delay(500);”语句被执行,“receiver.Post(5).Wait();”不再等待。
我尝试了几种变体(TaskCompletionSource、ContinueWith、...),但都不起作用。
有人知道如何解决这个问题吗?
【问题讨论】:
-
您不能通过将
_receiver更改为TransformBlock来更改您的代码,并将以下操作放入一个新的ActionBlock,链接到_receiver? -
你能给我一个小的代码示例吗?我不明白重构应该如何解决“排他行为”问题。
标签: c# asynchronous task-parallel-library async-await tpl-dataflow