2011-07-04 81 views
0

我有一系列需要以特定順序調用的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); 
} 
} 

我不認爲寫每個方法不同的回調事件,並調用下一個方法是不錯的主意。

+0

這看起來不像WCF對我?直截了當的webclient。你能澄清一下它是什麼嗎? – AnthonyWJones

回答

1

這實在是代碼只是不同重新安排,但你可以簡單地創建需要運行一個又一個「任務」的隊列中。

那「任務管理器」可以捕獲從每個任務完成的任何事件,並開始在隊列中的下一個任務。

任務界面是你的,但它只是需要一個啓動方法和OnCompleted事件爲最小,但你將需要處理的故障理智爲好。

背景

我們以前做過這樣的事情了一年多,因爲我們需要執行兩個並行和串行任務,所以建造它使我們的每一個任務可以包含其他任務(我們的任務管理器只本身成爲頂級任務)。然後,您的高級代碼將成爲任務管理器上的一組adds,以創建子任務的適當順序,然後管理員調用開始第一個任務。

作爲一個指導,編寫一個複雜的子系統(一次)往往會更好,它爲所有應用程序提供了一個非常簡單的頂層級別,而不是將代碼和事件處理程序縫合在一起。

1

如果我知道你想什麼正確的,你的action場只是改變到的動作隊列。在WebClient_UploadStringCompleted,寫:

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