Ho un ricevitore classe con un'ActionBlock:attendere 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);
}
//...
}
Il registro-azione per l'ActionBlock è un async-metodo con un await-Statement:
private static async Task Writer(int num)
{
Console.WriteLine("start " + num);
await Task.Delay(500);
Console.WriteLine("end " + num);
}
Ora quello che voglio fare è attendere sincrono (se una condizione è impostata) fino a quando il metodo azione è finito per ottenere un comportamento esclusivo:
var receiver = new Receiver<int>();
receiver.Register((Func<int, Task) Writer);
receiver.Send(5).Wait(); //does not wait the action-await here!
Il problema è quando "attendi Task.Delay (500);" l'istruzione è eseguita, il "receiver.Post (5) .Wait();" non aspetta più
Ho provato diverse varianti (TaskCompletionSource, ContinueWith, ...) ma non funziona.
Qualcuno ha un'idea di come risolvere il problema?
Couldn' Se cambi il tuo codice cambiando '_receiver' in un' TransformBlock' e metti la seguente azione in un nuovo 'ActionBlock', collegato a' _receiver'? – svick
Puoi darmi un piccolo esempio di codice? Non capisco come quel refactoring debba risolvere con il problema del "comportamento esclusivo". – obi111