2012-10-31 4 views
3

저는 C#에 다소 익숙하며 비동기 메서드에서 textbox 값을 검색하는 데 문제가 있습니다. 내가 UI에서 텍스트 입력을 검색하고 코드에서 사용하는 스레드. VS 2010은 내 코드를 허용하지만 디버깅을 시작할 때 Invalid cross-thread access 예외가 발생합니다. 아이디어? 내가 놓친 게 있니?다른 메서드 또는 비동기에서 텍스트 상자에 액세스

public void Response_Completed(IAsyncResult result) 
{ 
    HttpWebRequest request = (HttpWebRequest)result.AsyncState; 
    HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result); 

    using (StreamReader streamReader = new StreamReader(response.GetResponseStream())) 
    { 
     JObject rootObject = JObject.Load(new JsonTextReader(streamReader)); 

     string tracknum = trackid.Text; // Invalid cross-thread access exception 
     string source = rootObject[tracknum]["source"].ToString(); 

     Deployment.Current.Dispatcher.BeginInvoke(() => 
     { 
      //removed 
     }); 
    } 
} 

참고 : 나는 윈도우 폰 7 플랫폼에서이 작업을 수행하려고 해요

당신은 대신에 다른 스레드의, UI 스레드에서 텍스트 상자의 값을 얻기 위해해야 ​​

답변

1

. Invoke method는 UI 스레드에서 지정된 대리자를 실행합니다

string tracknum = (string)trackid.Invoke(new Func<string>(() => trackid.Text)); 

편집 : 윈도우 폰에

: 당신이 개체에 액세스하려고 시도하기 때문에이 같은 예외를 받게됩니다

string tracknum = string.Empty; 
Deployment.Current.Dispatcher.BeginInvoke(() => 
    { 
     tracknum = trackid.Text; 
     string source = rootObject[tracknum]["source"].ToString(); 
    }); 
+0

감사를 찾을 수 좋겠지 만 것입니다 윈도우 폰 7에서이 작품? 나는 이것을 시도했지만 작동하지 않는 'System.Controls.Textbox'에 'Invoke'에 대한 정의가 포함되어 있지 않은가? – ForeverLearning

+0

@ForeverLearning : 글쎄, 실제로 Window Phone 7에서 실행된다는 것을 모르는 경우, 태그를 지정해야합니다. –

+0

죄송합니다. 그래도 고맙습니다. – ForeverLearning

0

(스레드를 비동기 적으로 액세스하려고 시도했습니다.)

이 문제를 해결하려면 컨트롤의 기본 윈도우 핸들을 소유 한 스레드에서 대리자를 실행해야합니다. 이러한 경우, 우리는

public void Response_Completed(IAsyncResult result) 
{ 
    this.Invoke((MethodInvoker)delegate 
    { 
     HttpWebRequest request = (HttpWebRequest)result.AsyncState; 
     HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result); 
     using (StreamReader streamReader = new StreamReader(response.GetResponseStream())) 
     { 
      JObject rootObject = JObject.Load(new JsonTextReader(streamReader)); 
      string tracknum = trackid.Text; // Invalid cross-thread access exception 
      string source = rootObject[tracknum]["source"].ToString(); 
     } 
    }); 
} 

MethodInvoker가 무효 파라미터리스트 메소드를 호출하는 데 사용되는 간단한 대리자를 제공 Invoke(Delegate method)

실시 예를 이용할 수있다. 이 대리자는 컨트롤의 Invoke 메서드를 호출 할 때 또는 간단한 대리자가 필요할 때 사용할 수 있지만 직접 정의하지는 않습니다.

감사합니다,
난 당신이 답변이 도움이 :)

+0

답장을 보내 주셔서 감사합니다 :) 현재 Windows Phone 응용 프로그램 (비동기 학습) 용으로 작성 중이므로 대리자를 비동기 적으로 호출 할 수없는 것 같습니다. – ForeverLearning

+0

@ForeverLearning 아, 죄송합니다. 문제가 해결되어 기쁘게 생각합니다. 좋은 하루 되세요! :) –

관련 문제