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

Isa*_*ger 7 c# winforms

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

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

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

谢谢

艾萨克

Mar*_*ing 9

后台工作者是一个不同于Windows窗体的线程.因此,您需要让后台工作人员以某种方式将信息返回给主线程.在下面的示例中,我使用backgroundworker的reportProgress功能,因为事件是在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();
    }

}
Run Code Online (Sandbox Code Playgroud)

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