【发布时间】:2010-06-18 16:11:15
【问题描述】:
不确定我的标题是否用词好,但无论如何:)
我有两个线程:一个包含需要完成的工作的主线程,以及一个包含带有进度条和取消按钮的表单的工作线程。在普通代码中,情况正好相反,但在这种情况下我不能这样做。
当用户单击取消按钮时,会显示一个提示,询问他是否真的要取消工作。问题是主线程上的工作仍在继续。我可以让主线程停止工作等,但我希望当他在提示上单击“是”时它停止工作。
例子:
// Main thread work starts here
t1 = new Thread(new ThreadStart(progressForm_Start));
t1.Start();
// Working
for (i = 0; i <= 10000; i++)
{
semaphore.WaitOne();
if (pBar.Running)
bgworker_ProgressChanged(i);
semaphore.Release();
if (pBar.IsCancelled) break;
}
t1.Abort();
// Main thread work ends here
// Start progress bar form in another thread
void progressForm_Start()
{
pBar.Status("Starting");
pBar.ShowDialog();
}
理论上我可以在 cancelWatch() 函数中包含一个提示,但是我必须在我实现这个类的任何地方都这样做。
【问题讨论】:
-
为什么不能将表单放在主线程中,而只使用 Swing WorkerThread 呢?这看起来很复杂。还有你所说的“普通代码”是什么意思
-
我所说的“普通代码”是指我一开始会怎么想。我不能将表单放在主线程中,因为我需要能够随时单击“取消”按钮来取消操作。但是我不能使用 BackgroundWorker,因为我不想在这里使用异步线程。主线程已经是一个显示数据并在后台做一些事情的表单。我需要一个进度条和一个取消按钮,而在主窗体上做这件事几乎是不可能的。
标签: c# multithreading