簡體   English   中英

如何將SelectMany用於Observable.FromEventPattern序列上的異步邏輯?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM