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