2011-07-04 18 views
0

私は一連のasycメソッドをperticularシーケンスで呼び出す必要があります。問題は、すべてのメソッドがWCFサービスにリクエストを行うことです。 WCF呼び出しを行うメソッドは、プロジェクト全体に共通です。 WCF呼び出しのコールバック関数では、WCF呼び出しが成功したかどうかを判断します。 WCF呼び出しが成功した場合は、別のメソッドを呼び出す必要があります。順番に、1つ後に呼び出される多くのメソッドがあります。非同期メソッドの呼び出し - シーケンスの維持

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のように見えませんか? Just Straight webclient。あなたはそれがどれであるかを明らかにすることができますか? – AnthonyWJones

答えて

1

実際にはコードの並べ替えが異なるだけですが、次々に実行する必要がある「タスク」のキューを作成するだけで済みます。

「タスクマネージャ」は、各タスクから完了イベントをキャッチし、キュー内の次のタスクを開始することができます。

Taskインターフェイスはあなた次第ですが、StartメソッドとOnCompletedイベントを最低限必要とするだけですが、失敗も適切に処理する必要があります。

背景

私達はちょうど私たちのタスクマネージャ(我々が実行されるように、並列および順次の両方の作業を必要に応じて一年以上前にこのような何かをしたので、私たちのタスクのそれぞれが他のタスクが含まれていることができるように構築されましたトップレベルのタスクそのものになりました)。あなたの上位レベルのコードは、タスクマネージャのaddsのセットになり、子タスクの適切な順序付けを作成し、最初のタスクを開始するというマネージャ呼び出しが行われます。

ガイドとして、コードとイベントハンドラをつなぎ合わせるよりも、すべてのアプリケーションで非常にシンプルなトップレベルを提供する複雑なサブシステム(1回)を書く方がしばしば役に立ちます。

1

正しく理解している場合は、actionフィールドをアクションのキューに変更してください。 WebClient_UploadStringCompletedの場合:

if (actionQueue.Count > 0) 
{ 
    var action = actionQueue.Dequeue(); 
    action(e.Result); 
} 
関連する問題