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??
}