gpt4 book ai didi

multithreading - Silverlight Task.WaitAll使用Rx

转载 作者:行者123 更新时间:2023-12-03 13:21:51 24 4
gpt4 key购买 nike

我想同时调用两个Web服务,并在两个都完成时处理响应。我正在使用Rx的Observable.FromAsyncPattern方法调用网络服务。同时预订多个IObservable的正确方法是什么?

我已经尝试过使用Zip,但是似乎并没有同时启动这两个程序,只是在收到第一个结果后才开始第二个程序。
编辑:
这是Zip的演示,或者提出了其他一些不能解决我的问题的解决方案-

class Program
{
static void Main(string[] args)
{

var observable1 = Observable.Create<int>(i =>
{
Console.WriteLine("starting 1");
System.Threading.Thread.Sleep(2000);
Console.WriteLine("done sleeping 1");
i.OnNext(1);
i.OnCompleted();
return () => { };
});
var observable2 = Observable.Create<int>(i =>
{
Console.WriteLine("starting 2");
System.Threading.Thread.Sleep(4000);
Console.WriteLine("done sleeping 2");
i.OnNext(1);
i.OnCompleted();
return () => { };
});

var m = observable1.Zip(observable2, (a, b) => new { a, b });

var n = Observable.Merge(Scheduler.ThreadPool,
observable1, observable2);

var o = Observable.When(observable1.And(observable2).Then((a, b) => new { a, b }));


m.Subscribe(
(i) => Console.WriteLine(i),
() => Console.WriteLine("finished"));

Console.Read();
}
}

结果:
starting 1
done sleeping 1
starting 2
done sleeping 2
{ a = 1, b = 1 }
finished

所需结果:
starting 1
starting 2
done sleeping 1
done sleeping 2
{ a = 1, b = 1 }
finished

最佳答案

在这里,使用Zip扩展方法是简单的答案。

如果您有几个典型的异步调用(假设输入单个参数):

Func<X1, IObservable<X2>> callX = Observable.FromAsyncPattern<X1, X2>(...);
Func<Y1, IObservable<Y2>> callY = Observable.FromAsyncPattern<Y1, Y2>(...);

然后,您可以调用它们并在两个都完成后在其中处理返回值,如下所示:
callX(x1).Zip(callY(y1), (x2, y2) =>
{
...
});

关于multithreading - Silverlight Task.WaitAll使用Rx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6670688/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com