[英]How to use SelectMany for async logic on Observable.FromEventPattern sequence?
我有一個公開以下可觀察序列的類:
internal IObservable<TaskDoneEventArgs> WhenTaskDone => Observable
.FromEventPattern<TaskDoneEventHandler, TaskDoneEventArgs>(
handler => NiTask.Done += handler,
handler => NiTask.Done -= handler)
.Select(x => x.EventArgs);
每當從序列中觀察到新項目時,我都想執行一些異步TPL邏輯。 據我了解, SelectMany()
是處理異步邏輯的好方法。 但是,我在語法正確方面遇到困難。
以下是我這樣做的嘗試,但是無法編譯:
_output.WhenTaskDone
.SelectMany(async _ => await StopDelivery())
.Subscribe(_ => Debug.WriteLine("Delivery stopped"));
我收到與SelectMany()
有關的以下錯誤:
Error CS0411: The type arguments for method 'Observable.SelectMany<TSource, TOther>(IObservable<TSource>, IObservable<TOther>)' cannot be inferred from the usage. Try specifying the type arguments explicitly. (85, 18)
StopDelivery()
函數的簽名如下:
internal Task StopDelivery()
我在這里想念什么並且做錯了什么?
如果要基於返回Task
的方法將單個操作插入到管道中,以使Task
在原始值返回給訂閱服務器之前完成,那么您需要執行以下操作:
.SelectMany(_ => Observable.FromAsync(() => StopDelivery()), (x, y) => x)
這是一個完整的工作示例:
void Main()
{
WhenTaskDone
.SelectMany(_ => Observable.FromAsync(() => StopDelivery()), (x, y) => x)
.Subscribe(_ => Debug.WriteLine("Delivery stopped"));
NiTask.OnDone();
}
private NiTaskClass NiTask = new NiTaskClass();
internal IObservable<TaskDoneEventArgs> WhenTaskDone =>
Observable
.FromEventPattern<TaskDoneEventHandler, TaskDoneEventArgs>(
handler => NiTask.Done += handler,
handler => NiTask.Done -= handler)
.Select(x => x.EventArgs);
internal Task StopDelivery() => Task.Run(() => Console.WriteLine("StopDelivery"));
public delegate void TaskDoneEventHandler(object sender, TaskDoneEventArgs e);
public class TaskDoneEventArgs : EventArgs { }
public class NiTaskClass
{
public event TaskDoneEventHandler Done;
public void OnDone()
{
this.Done?.Invoke(this, new TaskDoneEventArgs());
}
}
這是放在LINQPad中的 -一旦您通過NuGet添加System.Reactive
,就可以進行復制和粘貼,並且應該可以正常運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.