2011-10-30 11 views
0

私は非同期Webリクエストを処理中です。メッセージリターンを行うにはレスポンスに依存する必要があります。同じスレッドにないオブジェクトを変更する方法

はそれを行うための最善の方法は何か

// creating request 

string messageToReturn = string.empty; 
request.BeginGetResponse(ar => 
      { 
       HttpWebRequest req2 = (HttpWebRequest)ar.AsyncState; 
       var response = (HttpWebResponse)req2.EndGetResponse(ar); 

       // is it safe to do this? 
       messageToReturn = "base on respone, assign different message"; 


      }, request); 

// will i get any response message? i will always get empty right? 
// since response is handle in another thread 
return messageToReturn; 

を次のようにSTHを行うには考えていましたか?

答えて

0

あなたが正しいのは、BeginGetResponseメソッドで非同期リクエストを発生させたため、その変数は常に空です。だから、本当にここにはいくつかのオプションがあります。応答が返ってくるまで実行中のスレッドをブロックすることができます(これは非常に強力な引数がなければ、おそらく本当に悪い考えです)。あるいは、応答が返ってきたときに呼び出し元に警告するイベントベースの非同期パターンを使用できます...

ここでイベントベースのパターンを配線する方法

public void GetMessageAsync() 
{ 
    string messageToReturn = string.empty; 
    request.BeginGetResponse(ar => 
      { 
       HttpWebRequest req2 = (HttpWebRequest)ar.AsyncState; 
       var response = (HttpWebResponse)req2.EndGetResponse(ar); 

       // is it safe to do this? 
       messageToReturn = "base on respone, assign different message"; 


      }, request); 
} 

に包まれたあなたのコードのいくつかを考えてみましょう。カスタムのEventArgsクラスと、呼び出し元がリッスンできるカスタムイベントと、応答が戻ったときに発生するカスタムイベントを定義します。返信用

public class StringEventArgs : EventArgs 
{ 
    public string Message { get; set; } 
} 

public event EventHandler<StringEventArgs> MessageReturned; 

public void GetMessageAsync() 
{ 
    //string messageToReturn = string.empty; 
    request.BeginGetResponse(ar => 
      { 
       HttpWebRequest req2 = (HttpWebRequest)ar.AsyncState; 
       var response = (HttpWebResponse)req2.EndGetResponse(ar); 

       //messageToReturn = "base on respone, assign different message"; 
       this.MessageReturned(this, new StringEventArgs { Message = response.ToString() }); 

      }, request); 
} 
+0

THX ...あなたは、私はちょうどこれを行うことができると思います:Dispatcher.BeginInvoke(()=> {messateToReturn = "" 何か ";}); – jojo

+0

いや、でもそのメソッドが実行されますので、非同期的に呼び出され、messageToReturnを返すときに呼び出しが完了することは保証されません。応答が戻されるまでスレッドをブロックしたい場合は、ManualResetEventをチェックしてください。 –

関連する問題