我有一系列asyc方法需要以特定顺序调用。问题是,所有方法都向WCF服务发出请求。使WCF调用的方法对整个项目是通用的。在WCF调用的回调函数中,我确定WCF调用是否成功。如果WCF调用成功,我需要调用另一个方法。有许多方法可以按顺序调用,一个接一个地调用。
private Action<string> action;
public void MakeHttpPostRequest(string webserviceURL, string json, Action<string> response)
{
try
{
this.action = response;
if (Microsoft.Phone.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
{
Uri uri = new Uri(webserviceURL);
byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(json);
string data = Encoding.UTF8.GetString(byteArray.ToArray(), 0, (int)byteArray.Length);
WebClient webClient = new WebClient();
webClient.UploadStringCompleted += new UploadStringCompletedEventHandler(this.WebClient_UploadStringCompleted);
webClient.Headers["Content-type"] = "application/json";
webClient.Encoding = Encoding.UTF8;
webClient.UploadStringAsync(uri, "POST", data);
}
else
{
this.action(string.Empty);
}
}
catch (Exception ex)
{
new ErrorException.ErrorException().HandleError(ex, string.Empty, Global.Modules.General);
}
}
private void WebClient_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
{
try
{
// Check whether to invoke any method
if (this.action != null)
{
// Invoke the method passed to MakeHttpPostRequest by it's calling method
this.action(e.Result);
}
}
catch (Exception ex)
{
new ErrorException.ErrorException().HandleError(ex, string.Empty, Global.Modules.General);
}
}
我不认为为每个方法编写不同的回调事件并调用next方法是个好主意。
答案 0 :(得分:1)
它实际上只是一个不同的代码重新排列,但你可以简单地创建一个需要一个接一个地运行的“任务”队列。
“任务管理器”可以捕获每个任务的任何完成事件,并开始队列中的下一个任务。
任务界面取决于你,但它只需要一个Start方法和一个OnCompleted事件,但你也需要理智地处理失败。
<强>背景强>
我们在一年多前做了类似的事情,因为我们需要执行并行和顺序任务,因此构建它以便我们的每个任务都可以包含其他任务(我们的任务管理器本身就成了顶级任务)。然后,您的高级代码将成为任务管理器上的一组adds
,以创建子任务的适当顺序,然后通过管理器调用启动第一个任务。
作为指南,通常最好编写一个复杂的子系统(一次),在所有应用程序中为您提供一个非常简单的顶级,而不是将代码和事件处理程序拼接在一起。 < / p>
答案 1 :(得分:1)
如果我理解你想要什么,只需将你的action
字段更改为一系列操作即可。在WebClient_UploadStringCompleted
中,写一下:
if (actionQueue.Count > 0)
{
var action = actionQueue.Dequeue();
action(e.Result);
}