C# 在不阻塞当前线程的情况下显示窗体(对话框)(progressbar示例)

C# 在不阻塞当前线程的情况下显示窗体(对话框)(progressbar示例),c#,.net,multithreading,devexpress,C#,.net,Multithreading,Devexpress,我正在尝试创建一个ProgressBar表单,该表单在显示进度条时使用来在不同的线程上执行操作 目前,我的ProgressBar类包含一个ProgressBarControl,代码如下所示: public partial class QTProgressBar : DevExpress.XtraEditors.XtraForm { private BackgroundWorker m_backgroundWorker; private AutoResetEvent m_reset

我正在尝试创建一个ProgressBar表单,该表单在显示进度条时使用来在不同的线程上执行操作

目前,我的ProgressBar类包含一个ProgressBarControl,代码如下所示:

public partial class QTProgressBar : DevExpress.XtraEditors.XtraForm
{
    private BackgroundWorker m_backgroundWorker;
    private AutoResetEvent m_resetEvent;

    public QTProgressBar()
    {
        InitializeComponent();

        InitializeProgressBar();

        m_backgroundWorker = new BackgroundWorker();
        m_backgroundWorker.WorkerReportsProgress = true;
        m_backgroundWorker.WorkerSupportsCancellation = true;
        m_backgroundWorker.DoWork += new DoWorkEventHandler(m_backgroundWorker_DoWork);
        m_backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(m_backgroundWorker_ProgressChanged);
        m_backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(m_backgroundWorker_RunWorkerCompleted);
        m_resetEvent = new AutoResetEvent(false);
    }

    void m_backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        m_resetEvent.Reset();

        CloseProgressBar();
    }

    void CloseProgressBar()
    {
        if (InvokeRequired)
        {
            Invoke( new MethodInvoker(CloseProgressBar));
            return;
        }
        this.Close();
    }

    void m_backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        Action operation = e.Argument as Action;
        operation();
    }

    public void StartAsyncTask(Action operation)
    {
        m_resetEvent.Set();
        m_backgroundWorker.RunWorkerAsync(operation);
    }
}
现在,当我想显示弹出窗口时,我会这样做:

QTProgressBar op = new QTProgressBar();
op.StartAsyncTask(() => LongDurationOperation(5, 5));
op.ShowDialog(); // i would like to move this inside the ProgressBar class.
//Thread gets blocked here until operation finishes. 
其中LongDurationOperation是:

public void LongDurationOperation(int n, int m)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            Thread.Sleep(100);
        }
    }
}
progressBar类的方法。 如果我将其移动到ProgressBar类中的任何位置,线程将被阻塞,操作将不会执行

可以避免阻塞调用Showdialog()方法的线程吗

另外,你能给我一些关于如何改进这门课的提示吗


非常感谢。

表单中存在两种不同的调用:

myForm.ShowDialog();
是阻止调用它的线程的模式版本。它用于弹出窗口,必须防止发生其他操作(如保存对话框)

是非模态版本。它不会阻止当前线程,但不会返回任何结果。但是,您必须将其传递给所有者,通常如下所示:

myForm.Show(this);

我想知道答案。在我看来,这个.Handle返回一个IntPtr,Show(这个.Handle)生成一个编译器错误。@DanDinu:Oh-wow。。。我在工作中睡觉。对不起,我编辑了我的帖子。它是
Show(this)
not
Show(this.Handle)
其中
this
是一个有效的
表单
。还有Show()没有指定所有者,这与设置Visible=true相同。
myForm.Show(IWin32Window owner);
myForm.Show(this);