2013-02-25 1 views
1

다른 사람이 작성한 일부 코드를 이해하려고합니다. 나는 대체 무슨 일이 일어나는지 정확히 이해하지만, 정확히는 그렇지 않다. 문제는 해당 코드가 다른 스레드에서 실행되고 해당 두 번째 스레드에서 이벤트를 처리한다는 것입니다. 그러나 사용자에게 경고 메시지를 표시해야하며 UI가 첫 번째 스레드에서 실행 중이므로 두 번째 스레드의 경고가 표시되는 것은 물론 표시되지 않습니다. 그렇다면 첫 번째 스레드가 두 번째 스레드에서 검색 한 내 biz 개체를 전달하거나 마샬링하는 첫 번째 스레드로 "전환"하여 첫 번째 스레드가이를 처리하고 경고를 표시 할 수 있습니까? 나는 그런 상황에서 대리인을 사용할 것이라고 생각했지만 대리인은 여전히 ​​두 번째 스레드에서 실행 중입니까? 첫 번째 스레드에 대한원래 스레드로 돌아 가기 경고 프롬프트를 표시하십시오.

public delegate void MessageReceivedEventHandler(object sender, MessageEventArgs args); 

public class MessageEventArgs : EventArgs 
{ 
    ...snip... 
} 

public class MSMQListenerService 
{ 
... 
    public event MessageReceivedEventHandler MessageReceived; 
    .... 

    public void Start() 
    { 
     ... 
     //this is where we jump to a second thread as this method is IAsyncResult 
     _queue.BeginReceive(); 
     ... 
    } 
    .... 
} 

코드 :

....snip... 

x = new MSMQListenerService(@".\private$\abc"); 
x.MessageReceived += x_MessageReceived; 
x.FormatterTypes = new Type[] { typeof(LoginStatusMessage) }; 
x.Start(); 

...snip.... 

void x_MessageReceived(object sender, MessageEventArgs args) 
{ 
//this handler is running on a different thread??? 
//I'm OK with that just need to get the args back to the first thread 
} 

그래서 내가 게시물을 압도하지 않고 관련이있을 것이라고 생각 코드를 게시 한 다음

두 번째 스레드에 대한 코드입니다. 그래서 뭔가 빠져있는 경우 알려 주시기 바랍니다 그리고 나는 확실히 그것을 바로 추가 할 것입니다.

TIA JB는

+1

확인 정보를 얻기 위해이 튜토리얼을 읽어 보는 것이 좋습니다. dispatcher.aspx – MarcinJuraszek

답변

1

당신은 당신의 자신의 질문에 대답했습니다 : 당신은 UI 스레드에서 호출을 호출해야합니다.

this.BeginInvoke(new Action(() => { MessageBox.Show("THIS WILL SHOW ON UI THREAD"); })); 

또는 대신 람다 식을 사용

, 당신이 대표를 사용할 수 있습니다

this는 UI 스레드에서 실행되고있는 인스턴스를 참조
private void DisplayMessage(string message) 
{ 
    ... 
} 

private delegate void SomeDelegateThatWillRunOnUIThread(string message); 

... 

this.BeginInvoke(new SomeDelegateThatWillRunOnUIThread(DisplayMessage), yourMessage); 

. http://msdn.microsoft.com/en-us/library/system.windows.threading :

나는 강하게 당신이 더 많은 통찰력을 Dispatcher` 클래스`에 대한 http://www.codeproject.com/Articles/10311/What-s-up-with-BeginInvoke

+0

Sooo 음,이 글에서 좋은 웃음을 얻을 것이라고 확신하지만 **이 ** (UI가 실행되는 인스턴스)에 대한 처리 방법을 모르겠습니다. 두 번째 스레드가 아닌 BeginInvoke 대리자를 실행하겠습니까? 어쨌든 나는 그 질문에 대답 할 것이라고 확신하면서 지금 튜토리얼을 진행할 것입니다. – GPGVM

+0

좋아, 나는 혼란스러워. 효과가 있었지만 여전히 확실하지 않습니다. this.BeginInvoke는 두 번째 스레드에서 실행됩니다 ... 따라서 ** this **는 두 번째 스레드의 컨텍스트 내에 있습니다. 좋아요. msg 메세지를 msg 메세지로 보내고, 펌프 메세지를 UI 메세지로 보냅니다. 나는 그 권리가 있니? 당신이 "이것이 UI 스레드에서 실행되는 인스턴스를 가리키는 곳"이라고 말했기 때문에 확실하지 않습니다. ?????? – GPGVM

+0

키워드 ** this **는 현재있는 클래스의 인스턴스를 의미합니다. 즉, 원래 호출 된 스레드 (이 경우 UI 스레드)에 있음을 의미합니다. ** this.beginInvoke **를 호출하면 x_MessageReceived 메소드가 속한 클래스 인스턴스의 스레드에서 코드를 실행하려고한다는 것을 알 수 있습니다. Begininvoke는 실제로 컨트롤 클래스에서 파생되므로 컨트롤 객체 (다른 폼)의 다른 인스턴스가있는 경우 ** NameOfYourControlObject.BeginInvoke **를 호출 할 수도 있으며 해당 스레드에서도 코드가 실행됩니다. – l46kok

관련 문제