显示来自DoWork线程的MessageBox

时间:2019-02-25 21:47:05

标签: c# multithreading winforms backgroundworker messagebox

在我的c#WinForm应用程序中,我正在使用BackgroundWorker进行耗时的任务。现在,如果发生错误,我想显示一个MessageBox。我无法使用ReportProgress方法,因为我希望可以重试,忽略或取消。因此,我必须从DoWork线程调用MessageBox,以便可以对DialogResult进行响应。另外,我还需要MessageBox来阻止DoWork线程。

这是我到目前为止所拥有的:

private void DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 0; i < count; i++)
    {
        try
        {
            // Do stuff
        }
        catch (Exception ex)
        {
            DialogResult dialog = (DialogResult) this.Invoke(new Func<IWin32Window,DialogResult>((owner) =>
            {
                return MessageBox.Show(owner, "Something bad happened", "Oooops", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error);
            }), this);
            if (dialog == DialogResult.Abort)
            {
                e.Cancel = true;
                return;
            } // else ... 
        } // end catch
        worker.ReportProgress((int)progress);
    } // end for
}

MessageBox出现片刻并消失。窗体变得无响应,好像仍显示消息框。 直接从该线程(没有Invoke)调用MessageBox也不起作用。我也尝试过使用namend委托。

0 个答案:

没有答案