在web服务中线程化对web服务的调用-(.net 2.0)
本文关键字:web 服务 net 线程 调用 | 更新日期: 2023-09-27 18:29:30
收到一个关于在web服务中执行并行web服务调用的最佳实践的问题。这是在项目的另一部分无法按时交付的情况下的备份计划。我宁愿有一些有效的东西,即使它被扔掉了,这样最终用户就不会被打扰。
我们的门户网站将获得一条消息,将该消息拆分为2条消息,然后对我们的经纪人进行2次调用。这些需要在单独的线程上以降低超时。
一种解决方案是做类似于(伪代码)的事情:*更新:没有想象的那么高效,执行速度很快,但没有通过委托异步调用那么快。
XmlNode DNode = GetaGetDemoNodeSomehow();
XmlNode ENode = GetAGetElNodeSomehow();
XmlNode elResponse;
XmlNode demResponse;
Thread dThread = new Thread(delegate
{
//Web Service Call
GetDemographics d = new GetDemographics();
demResponse = d.HIALRequest(DNode);
});
Thread eThread = new Thread(delegate
{
//Web Service Call
GetEligibility ge = new GetEligibility();
elResponse = ge.HIALRequest(ENode);
});
dThread.Start();
eThread.Start();
dThread.Join();
eThread.Join();
//combine the resulting XML and return it.
//Maybe throw a bit of logging in to make architecture happy
我们想到的另一个选项是创建一个工作类,并将服务信息传递给它并让它执行。这将使我们能够对正在发生的事情有更多的控制,但可能会增加额外的开销。
另一个选项是2个异步调用,并通过一个标志管理返回:更新:*这不如我尝试的更新方式有效。这比我下面的版本慢了25%(运行优化)。
personRevisedService.GetDemoCompleted += new GetDemoCompletedEventHandler(GetDemo_Completed);
personRevisedService.GetDemoAsync(SomeXML);
该门户网站服务每天将被调用约50000次。
我不想给这个笨蛋镀金。
我在找重量轻的东西。代理上调用的服务确实设置了超时限制,并且已经进行了大量的日志记录和审计,所以我对此并不担心。
这是.NET 2.0,尽管我很想升级,但我现在无法升级。所以请把2.0以上的所有优点都去掉。
更新
我决定用代理人给他们打电话。因为这是一个测试,我将调用同一个服务两次,因为另一个服务尚未构建。它的执行速度平均比使用〔WebServiceName〕Async(…)、快20-30%
public delegate XmlElement HServiceDelegate(XmlElement xml);
HServiceDelegate del1 = new HServiceDelegate(ws1.HGetDemographics);
HServiceDelegate del2 = new HServiceDelegate(ws2.GetDemographics);
IAsyncResult async1 = del1.BeginInvoke(x1.DocumentElement, callback1, null);
IAsyncResult async2 = del2.BeginInvoke(x2.DocumentElement, callback2, null);
//Not sure if this is the most efficient
while (!async1.IsCompleted && !async2.IsCompleted)
{
System.Threading.Thread.Sleep(5);
}
void callback1(IAsyncResult result)
{
AsyncResult r = (System.Runtime.Remoting.Messaging.AsyncResult)result;
HServiceDelegate caller = (HServiceDelegate)r.AsyncDelegate;
r1 = caller.EndInvoke(result);
}
您的方法效率非常低,很可能弊大于利。您将占用一个工作线程,直到两个调用都完成,并且您将毫无理由地生成许多完整线程。
考虑使服务异步化,并使用web引用的Begin/End*方法。