如何使用 List<> 阻止 ToObservable?
我第一次尝试 RX,有几个问题。
1)有没有更好的方法来完成我的集合的异步?
2)我需要阻塞线程直到所有异步任务完成,我该怎么做?
class Program
{
internal class MyClass
{
private readonly List<int> _myData = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
private readonly Random random = new Random();
public int DoSomething(int j)
{
int i = random.Next(j * 1000) - (j * 200);
i = i < 0 ? 1000 : i;
Thread.Sleep(i);
Console.WriteLine(j);
return j;
}
public IObservable<int> DoSomethingAsync(int j)
{
return Observable.CreateWithDisposable<int>(
o => Observable.ToAsync<int, int>(DoSomething)(j).Subscribe(o)
);
}
public void CreateTasks()
{
_myData.ToObservable(Scheduler.NewThread).Subscribe(
onNext: (i) => DoSomethingAsync(i).Subscribe(),
onCompleted: () => Console.WriteLine("Completed")
);
}
}
static void Main(string[] args)
{
MyClass test = new MyClass();
test.CreateTasks();
Console.ReadKey();
}
}
(注意:我知道我可以使用 Observable.Range 作为我的 Int 列表,但我的列表在实际程序中不是 Int 类型)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我可能会尝试
所以首先我更改了 DoSomethingAsync 以便它使用
Observable.Start
。 Observable.Start 将异步运行DoSomething
方法,并在该方法完成时通过IObservable.OnNext
返回值。然后,CreateTasks 方法像以前一样对集合中的每个项目运行,但将每个值提供给
SelectMany
,然后继续调用 DoSomethingAsync 方法。结果是,您将在每次完成对 DoSomethingAsync 的调用时收到一个OnNext
消息,并在它们全部完成时收到一个OnComplete
消息。I'd probably try
So firstly I've changed the DoSomethingAsync so that it uses
Observable.Start
. Observable.Start will run theDoSomething
method asyncronously and return the value throughIObservable.OnNext
when the method completes.Then the CreateTasks method runs over each item in the collection as it did before, but feeds each value into a
SelectMany
which continues with a call the DoSomethingAsync method. The result is, that you'll then recieve anOnNext
for each completed call to DoSomethingAsync and anOnComplete
when they are all complete.