Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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# 如何异步调用两个方法?_C#_.net_Web Services_Asynchronous - Fatal编程技术网

C# 如何异步调用两个方法?

C# 如何异步调用两个方法?,c#,.net,web-services,asynchronous,C#,.net,Web Services,Asynchronous,我有以下两种方法: private static void webservicecalls() { WebServiceOne(); WebServiceTwo(); } 那么,我如何异步调用这两个方法,而不是在调用第二个web服务之前等待第一个web服务调用完成呢 更新: 现在WebSerieOne和WebService都有子调用,例如: private static void WebServiceOne() { CallOne(); CallThree(); }

我有以下两种方法:

private static void webservicecalls()
{
   WebServiceOne();
   WebServiceTwo();
}
那么,我如何异步调用这两个方法,而不是在调用第二个web服务之前等待第一个web服务调用完成呢

更新:

现在WebSerieOne和WebService都有子调用,例如:

private static void WebServiceOne()
{
    CallOne();
    CallThree();
}

private static void WebServiceTwo()
{
    CallTwo();
    CallFour();
}
因此,我需要调用具有以下子调用顺序:-

CallOne();
CallTwo();
CallThree();
CallFour();

根据您使用什么来实现
webserviceCone
webservicetwo
,web服务工具本身很可能具有完全的异步支持,因此首先要做的是:检查这一点,并使用异步API而不是同步API

如果由于某种原因,这种情况不存在,您可以执行以下操作:

var task = new Task(() => webservice1());
task.Start();
webservice2();
task.Wait();
(很明显,您可以完全异步运行这两个函数;我在上面假设您只想并行运行它们,并在最后“连接”它们)

重新编辑:如果顺序必须正好是“一”、“二”、“三”、“四”,则不能并行执行,因此只能在后台运行整个过程:

new Task(() => {
    webservice1();
    webservice2();
}).Start();

这将保证执行顺序,牺牲并行性。

请查看此处的任务库,以及左侧子类别的导航


我喜欢使用动作

private static void WebServiceCalls()
{ 
    var someState = 3;
    Action a1 = () => { WebserviceOne(); };
    Action a2 = () => { WebserviceTwo(); };

    a1.BeginInvoke(WebServiceCallBack, someState); //see code section below
    a2.BeginInvoke(null, null); //fire and forget...

}
这还允许您创建用于处理代码的回调:

void WebServiceCallBack(IAsyncResult result)
{
    int state = (int)result.AsyncState;
    //do more??
}

@Mark提出了一个有效的观点:如果您在Visual studio中使用Web服务,则可以使用“服务引用配置”窗口创建具有异步语法的通道代理类。(即使用
BeginWebServiceOne
EndWebServiceOne
,这将排除创建异步包装的需要。)

应用程序是否具有用户界面?如果有的话-WinForms、WPF、Silverlight、ASP.NET?哪个版本的.NET?运营合同是什么样子的?(如果这是WCF服务呼叫)重新编辑:顺序必须正好是1/2/3/4吗?或者仅仅是一个必须在三个之前,两个必须在四个之前?是的,一定是一、二、三、四……@MarcGravel:的确如此。他靠记忆写作。已修复。但这将无法控制这些方法内的执行顺序,请参阅mu update。。最好的regards@testtest事实上,当您谈论异步时,您通常放弃的第一件事是对执行顺序的控制。我尝试在后台运行整个程序,但它不会以预期的顺序运行。@testtest第二个版本确实运行预期的顺序。它与原始代码没有任何不同。如果这不能正常工作,那么您的原始代码就被破坏了。
void WebServiceCallBack(IAsyncResult result)
{
    int state = (int)result.AsyncState;
    //do more??
}