异步方法调用-维护序列

本文关键字:维护 调用 异步方法 | 更新日期: 2023-09-27 18:01:10

我有一系列需要按属性顺序调用的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);
}
}

我不认为为每个方法编写不同的回调事件并调用下一个方法是个好主意。

异步方法调用-维护序列

这实际上只是一种不同的代码重排,但您可以简单地创建一个需要一个接一个运行的"任务"队列。

"任务管理器"可以捕获每个任务中的任何完成事件,并启动队列中的下一个任务。

Task接口由您决定,但它只需要一个Start方法和一个OnCompleted事件作为最低限度,但您也需要明智地处理故障。

背景

一年多前,我们做了这样的事情,因为我们需要并行和顺序任务来执行,所以构建它,以便我们的每个任务都可以包含其他任务(我们的任务管理器本身就是一个顶级任务(。然后,您的高级代码就变成了任务管理器上的一组adds,用于创建子任务的适当顺序,然后是启动第一个任务的管理器调用。

作为指南,编写一个复杂的子系统(一次(通常比将代码和事件处理程序缝合在一起要好,因为它可以在所有应用程序中为您提供一个非常简单的顶层

如果我正确理解您想要什么,只需将action字段更改为操作队列即可。在WebClient_UploadStringCompleted中,写入:

if (actionQueue.Count > 0)
{
    var action = actionQueue.Dequeue();
    action(e.Result);
}