簡體   English   中英

可觀察序列Rx c#的多個訂閱

[英]Multiple subscriptions to Observable sequence Rx c#

我正在嘗試在.NET中學習Rx框架,並在應用它的過程中學習我正在從事的任務之一。 我在下面的這個簡單用例中說明了我正在嘗試的功能。

我有一個IEnumerable序列,需要並行處理並向其應用一個函數(異步函數),該函數返回一個int值。 根據返回的值。 在下面的代碼中,僅在創建原始“序列”之后才創建奇怪序列和evenSequence,因此這里沒有發生真正的“即發即棄”。 使用Rx解決此問題的正確方法是什么?

    public void TestRx()
    {
        IEnumerable<string> inputs = new string[] { "T-1", "T-2", "T-3"};

        var sequence = inputs.ToObservable().Select(x => ReturnResult(x)).Merge();

        var oddSequence = sequence.Where(x => (x%2) != 0);
        var evenSequence = sequence.Where(x => (x%2) == 0);

        oddSequence.Subscribe(i => Console.WriteLine($"ODD VALUE {i}"));
        evenSequence.Subscribe(i => Console.WriteLine($"EVEN VALUE {i}"));
    }

    public async Task<int> ReturnResult(string s)
    {
        int result = -1;
        Int32.TryParse(s.Split('-')[1], out result);
        return result;
    }

謝謝你幫我

這將完成工作:

private Random random = new Random();

public void TextRx()
{
    new[] {"T-1", "T-2", "T-3"}
        .Select(s => ReturnResult(s).ToObservable())
        .Merge()
        .GroupBy(i => i % 2 == 0)
        .SelectMany(g => g.Select(i => (g.Key, Value: i)))
        .Subscribe(o => Console.WriteLine($"{(o.Key ? "EVEN" : "ODD")} VALUE {o.Value}"));
}

public async Task<int> ReturnResult(string s)
{
    await Task.Delay(random.Next(5000));
    int.TryParse(s.Split('-')[1], out var result);
    return result;
}
  • 它使用ValueTuple ,這是C#7的功能。 您需要使用Nuget抓住它。 當然,您可以使用匿名對象,但我更喜歡ValueTuple 它還使用C#7中的out變量和C#6中的字符串插值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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