Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# web服务中对web服务的线程调用-(.net 2.0)_C#_Multithreading_Web Services_.net 2.0 - Fatal编程技术网

C# web服务中对web服务的线程调用-(.net 2.0)

C# web服务中对web服务的线程调用-(.net 2.0),c#,multithreading,web-services,.net-2.0,C#,Multithreading,Web Services,.net 2.0,有一个关于在web服务中执行并行web服务调用的最佳实践的问题。这是一个备份计划,以防项目的另一剂药剂无法按时交付。我更希望有一些可以工作的东西,即使它被扔掉了,这样最终用户就不会被打断 我们的门户将获取一条消息,将该消息拆分为两条消息,然后对我们的代理进行两次调用。这些线程需要位于不同的线程上,以降低超时时间 一种解决方案是执行类似于(伪代码)的操作: *更新:没有想象的那么高效,执行速度快,但没有通过委托异步调用的速度快 XmlNode DNode = GetaGetDemoNodeSome

有一个关于在web服务中执行并行web服务调用的最佳实践的问题。这是一个备份计划,以防项目的另一剂药剂无法按时交付。我更希望有一些可以工作的东西,即使它被扔掉了,这样最终用户就不会被打断

我们的门户将获取一条消息,将该消息拆分为两条消息,然后对我们的代理进行两次调用。这些线程需要位于不同的线程上,以降低超时时间

一种解决方案是执行类似于(伪代码)的操作: *更新:没有想象的那么高效,执行速度快,但没有通过委托异步调用的速度快

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
我们考虑的另一个选项是创建一个worker类,将服务信息传递给它并让它执行。这将允许我们对正在发生的事情有更多的控制,但可能会增加额外的开销

另一个选项是2个异步调用,并通过标志管理返回: 更新: *这并不像我尝试的更新方式那样有效。这是25%的速度慢(运行优化)作为一个我有下面

        personRevisedService.GetDemoCompleted += new GetDemoCompletedEventHandler(GetDemo_Completed);                      
        personRevisedService.GetDemoAsync(SomeXML);
门户网站服务每天将被调用大约50000次

我不想给这个笨蛋镀金

我在找一些轻的东西。在代理上调用的服务确实设置了超时限制,并且已经进行了大量的日志记录和审计,因此我对此并不担心

这是.NET2.0,尽管我很想升级,但现在还不能。所以请把所有>2.0的好东西都放在外面

更新

我决定用一名代表给他们打电话。因为这是一个测试,所以我调用同一个服务两次,因为另一个服务尚未构建。它的执行速度比使用[WebServiceName]异步(…)平均快20-30%


你的方法效率很低,很可能弊大于利。在两个调用都完成之前,您将占用一个工作线程,并且您将毫无理由地生成许多完整线程


考虑使您的服务异步化,并使用web引用的Begin/End*方法。

您的方法效率很低,很可能弊大于利。在两个调用都完成之前,您将占用一个工作线程,并且您将毫无理由地生成许多完整线程


考虑使您的服务异步,并使用web引用的Begin/End*方法。

顺便说一句,在两个新线程上发送这两条消息并等待它们不会有什么好处。相反,保留在主线程上发送其中一个线程的逻辑,并且只生成一个新线程来发送另一个线程。如果主线程总是处于空闲状态,那么将工作转移到另一个线程是没有意义的。顺便说一句,在两个新线程上发送这两条消息并等待它们不会有什么好处。相反,保留在主线程上发送其中一个线程的逻辑,并且只生成一个新线程来发送另一个线程。如果主线程总是处于空闲状态,那么将工作转移到另一个线程是没有意义的。谢谢你的坦诚。不幸的是,我们不能修改现有的服务,我可以,但这将超出我们的更改范围,这将给回归带来混乱。那么,在这个路由上,我们将使用[ServiceName]异步方法并在回调中捕获响应,然后等待其他消息完成,然后再继续处理?(我总是避免在web服务中使用线程,所以我正在寻找一个安全的选择)。我相信你的建议,这就是我一直想去的地方。谢谢你的链接,新方法就是我现在正在做的原型。再次感谢如果它对你有用,请发布一个答案,展示你的新代码是如何工作的,我会投票支持它。谢谢约翰-让我走上了正确的轨道。回到.NET2.0总是很有趣的。谢谢你的坦诚。不幸的是,我们不能修改现有的服务,我可以,但这将超出我们的更改范围,这将给回归带来混乱。那么,在这个路由上,我们将使用[ServiceName]异步方法并在回调中捕获响应,然后等待其他消息完成,然后再继续处理?(我总是避免在web服务中使用线程,所以我正在寻找一个安全的选择)。我相信你的建议,这就是我一直想去的地方。谢谢你的链接,新方法就是我现在正在做的原型。再次感谢如果它对你有用,请发布一个答案,展示你的新代码是如何工作的,我会投票支持它。谢谢约翰-让我走上了正确的轨道。回到.NET2.0总是很有趣的。
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);
}