我会远离 方法1 ,因为它“打破”了Rx。当你 await 在 - 的里面 Select 你正在做什么是同步操作员做异步工作。每当你想要做一些异步的事情时,把它放在一个 SelectMany 。 SelectMany 甚至接受一个 Task<T> 直。
await
Select
SelectMany
Task<T>
在 方法2 你正在包装 Task 在一个可观察的内部。我相信这非常相似 Observable.FromAsync() 。然而,它有点沉重的创造了一个 Task 然后将其转换为可观察的;你可以直接使用一个observable:
Task
Observable.FromAsync()
integers.Where(id => (id & 1) == 0) .SelectMany(id => Observable.Start( () => evenHandler.LRP(id, RandomDelay()), ThreadPoolScheduler.Default)) .Subscribe(); integers.Where(id => (id & 1) == 1) .SelectMany(id => Observable.Start( () => oddHandler.LRP(id, RandomDelay()), ThreadPoolScheduler.Default)) .Subscribe();
这将创建一个返回a的observable Unit 当内部工作完成时。我还指出它应该运行在 TaskPoolScheduler 这使它在一个内部运行 Task 。
Unit
TaskPoolScheduler