gpt4 book ai didi

c# - 在不阻塞当前线程的情况下显示表单(对话框)(进度条示例)

转载 作者:行者123 更新时间:2023-12-03 19:39:50 26 4
gpt4 key购买 nike

我正在尝试创建一个使用 BackgroundWorker 的 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);
}
}
}

我想避免阻塞任何调用

的线程
ShowDialog() 

progressBar 类的方法。如果我将其移动到 ProgressBar 类线程内的任何位置,线程将被阻塞并且操作不会执行。

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

另外,你能给我一些关于如何改进这个类(class)的提示吗?

非常感谢。

最佳答案

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

myForm.ShowDialog();

是阻塞调用它的线程的模态版本。它用于必须阻止其他操作发生的弹出窗口(如保存对话框)。

myForm.Show(IWin32Window owner);

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

myForm.Show(this);

关于c# - 在不阻塞当前线程的情况下显示表单(对话框)(进度条示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13341241/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com