在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"));
- entity framework4.1代码优先 – 应初始化许多关系ICollections
- 使用VS2010在混合C#C(win32)项目中未加载符号
- 从javascript调用webmethod时,ASP.NET 500内部服务器出错
- 如何在存储库中正确处理Linq到SQL DataContext?
- “双向”和XmlParseValidationException中的ExceptionValidationRule
- 将启用的计算机添加到Active Directory OU
- 如何使用显式成员映射配置AutoMapper for Polymorphism?
- 绘制旋转的矩形
- Ninject:将父实例提供给正在解决的子项