ich ein Klasse-Receiver mit einem ActionBlock habe:erwarten async Lambda in 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);
}
//...
}
Die Register-Aktion für den ActionBlock ist eine Asynchron-Methode mit einem await-Statement:
private static async Task Writer(int num)
{
Console.WriteLine("start " + num);
await Task.Delay(500);
Console.WriteLine("end " + num);
}
Jetzt was ich tun möchte, ist, synchron zu warten (wenn eine Bedingung eingestellt ist), bis die Aktionsmethode beendet ist, um ein exklusives Verhalten zu erhalten:
Das Problem ist, wenn die "warten auf Task.Delay (500);" Anweisung ausgeführt wird, die "receiver.Post (5) .Wait();" wartet nicht mehr.
Ich habe mehrere Varianten (TaskCompletionSource, ContinueWith, ...) versucht, aber es funktioniert nicht.
Hat jemand eine Idee, wie man das Problem löst?
Couldn‘ t Sie ändern Ihren Code, indem Sie '_receiver' in einen' TransformBlock' ändern und die folgende Aktion in einen neuen 'ActionBlock' einfügen, der mit' _receiver' verknüpft ist? – svick
Können Sie mir ein kleines Codebeispiel geben? Ich verstehe nicht, wie dieses Refactoring durch "exklusives Verhalten" lösen sollte. – obi111