異步拉姆達我有一個類接收器與ActionBlock:等待在ActionBlock
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是一個異步方法用的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!
問題是當「等待Task.Delay(500);」語句被執行,「receiver.Post(5).Wait();」不再等待。
我嘗試了幾種變體(TaskCompletionSource,ContinueWith,...),但它不起作用。
有沒有人有一個想法如何解決這個問題?
Couldn」你可以通過改變'_receiver'到'TransformBlock'來改變你的代碼,並把下面的動作放到一個新的'ActionBlock'中,鏈接到'_receiver'? – svick
你能給我一個小代碼的例子嗎?我不明白重構應該如何通過「排他行爲」問題來解決。 – obi111