2011-10-30 2 views
0

비동기 웹 요청을 처리하고 있습니다. 메시지 회신을하기 위해 응답에 의존해야합니다. 동일한 스레드에없는 개체를 수정하는 방법

// 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

들으 ... 당신이 난 그냥이 작업을 수행 할 수 있습니다 생각하십니까 : Dispatcher.BeginInvoke는 (() => {messateToReturn = ""뭔가 ";}); – jojo

+0

아니, 때문에에게조차 그 메소드가 실행됩니다 비동기 적으로 호출하고 messageToReturn을 반환 할 때 호출이 완료된다는 보장은 없습니다. 응답이 돌아올 때까지 스레드를 정말로 차단하려면 ManualResetEvent를 확인하십시오. UI를 잠그므로주의하십시오! –

관련 문제