在winforms应用程序中,如何从必须始终位于前台的后台工作程序中运行消息框?

现在,我正在使用后台工作线程来经常检查某些内容,如果满足条件,则会生成一个消息框。

我暂时没有注意到,因为我在后台工作器中调用了消息框,我失去了通常的消息框行为,即在用户单击消息框上的是/否/取消之前不让用户单击主窗体。

那么,消息框上是否有一些选项可以将它始终保持在前台? 或者是否可以从后台工作者向主表单发送消息,以便我可以从那里生成消息框? 还有另一种方式吗?

谢谢

艾萨克

后台工作者是一个不同于Windows窗体的线程。 因此,您需要让您的后台工作人员以某种方式将信息返回给主线程。 在下面的示例中,我使用backgroundworker的reportProgressfunction,因为事件是在Windows窗体线程上触发的。

public partial class Form1 : Form { enum states { Message1, Message2 } BackgroundWorker worker; public Form1() { InitializeComponent(); worker = new BackgroundWorker(); worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged); worker.WorkerReportsProgress = true; worker.DoWork += new DoWorkEventHandler(worker_DoWork); } void worker_DoWork(object sender, DoWorkEventArgs e) { //Fake some work, report progress worker.ReportProgress(0, states.Message1); } void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { states state = (states)e.UserState; if (state == states.Message1) MessageBox.Show("This should hold the form"); } private void button1_Click(object sender, EventArgs e) { worker.RunWorkerAsync(); } } 

注意:后台工作程序不会在reportProgress处暂停。 如果你想让你的bgworker等到mbox被按下,你需要手动停止它。

您可以使用Form1类的Invoke方法来调用该窗体的UI线程。

 this.Invoke(() => MessageBox.Show("Hi"));