У меня есть класс Receiver с 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);
}
//...
}
Register-Action для 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!
Проблема в том, когда "await Task.Delay (500);" выполняется оператор "Receiver.Post (5) .Wait ();" больше не ждет.
Я пробовал несколько вариантов (TaskCompletionSource, ContinueWith, ...), но это не работает.
Есть у кого идеи как решить проблему?
_receiver
наTransformBlock
и поместив следующее действие в новыйActionBlock
, связанный с_receiver
? - person svick   schedule 05.12.2012