1

他の誰かが書いたコードを理解しようとしています。私は何が起こっているのかを大体理解していますが、正確ではありません。問題は、問題のコードが別のスレッドで実行され、その 2 番目のスレッドでイベントを処理することです。ただし、ユーザーにアラートを表示する必要があり、UI が最初のスレッドで実行されているため、もちろん、2 番目のスレッドからアラートを起動しても表示されません。では、2 番目のスレッドによって取得されたビジネス オブジェクトをハンドオフまたはマーシャリングする最初のスレッドに「切り替え」て、最初のスレッドがそれを処理してアラートを表示できるようにするにはどうすればよいでしょうか。このような状況でデリゲートを使用すると思いましたが、デリゲートはまだ 2 番目のスレッドで起動していますか?

2 番目のスレッドのコードは次のとおりです。

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
}

そのため、投稿を圧倒することなく、関連すると思われるコードを投稿しました。何か不足している場合はお知らせください。すぐに追加します。

ティアJB

4

1 に答える 1

1

あなた自身の質問に答えました: UI スレッドで呼び出しを呼び出す必要があります。

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

または、ラムダ式を使用する代わりに、デリゲートを使用できます。

private void DisplayMessage(string message) 
{ 
   ...
}

private delegate void SomeDelegateThatWillRunOnUIThread(string message);

...

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

UIthisスレッドで実行されているインスタンスを参照します。

このチュートリアルを読んで洞察を深めることを強くお勧めします http://www.codeproject.com/Articles/10311/What-s-up-with-BeginInvoke

于 2013-02-25T07:36:28.243 に答える