返回原始线程以显示警报提示

时间:2013-02-25 07:32:10

标签: c# multithreading

我希望了解别人写的一些代码。我一般都明白发生了什么,但并不完全清楚。问题是有问题的代码在另一个线程上运行并处理第二个线程上的事件。但是,我需要向用户显示警报,如果我从第二个线程触发警报,则它不会显示,当然,因为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 个答案:

答案 0 :(得分:1)

您已经回答了自己的问题:您需要在UI线程上调用该调用。

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

或者代替使用lambda表达式,您可以使用委托:

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

private delegate void SomeDelegateThatWillRunOnUIThread(string message);

...

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

其中this指的是在UI线程上运行的实例。

我强烈建议您阅读本教程以获得更多信息 http://www.codeproject.com/Articles/10311/What-s-up-with-BeginInvoke