异步方法调用 - 维护序列

时间:2011-07-04 11:54:17

标签: c# silverlight asynchronous

我有一系列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方法是个好主意。

2 个答案:

答案 0 :(得分:1)

它实际上只是一个不同的代码重新排列,但你可以简单地创建一个需要一个接一个地运行的“任务”队列。

“任务管理器”可以捕获每个任务的任何完成事件,并开始队列中的下一个任务。

任务界面取决于你,但它只需要一个Start方法和一个OnCompleted事件,但你也需要理智地处理失败。

<强>背景

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

作为指南,通常最好编写一个复杂的子系统(一次),在所有应用程序中为您提供一个非常简单的顶级,而不是将代码和事件处理程序拼接在一起。 < / p>

答案 1 :(得分:1)

如果我理解你想要什么,只需将你的action字段更改为一系列操作即可。在WebClient_UploadStringCompleted中,写一下:

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