不确定我的标题是否措辞得当,但无论如何:)
我有两个线程:包含需要完成的工作的主线程,以及包含带有进度条和取消按钮的表单的工作线程。在正常代码中,情况正好相反,但在这种情况下我不能这样做。
当用户单击取消按钮时,会显示一条提示,询问他是否真的要取消该工作。问题是工作在主线程上继续进行。我可以让主线程停止工作等,但我希望当他在提示上单击“是”时它停止工作。
Example:
// 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() 函数中包含一个提示,但随后我必须在实现此类的所有地方都这样做。
我有几个简短的评论:
- 避免使用
Thread.Abort()
这就是为什么.
- 让你的线程成为后台线程:
Thread.IsBackground = true
(当您的应用程序退出时,这将自动退出线程)。
这里有一个关于如何进行的详细讨论safely停止线程运行:在 C# 中使用布尔标志来停止线程运行是否安全
要停止主线程上的工作,您必须执行以下操作:
boolean volatile isRunning = true;
static void Main(...)
{
// ...
// Working
for (i = 0; i <= 10000; i++)
{
semaphore.WaitOne();
if (!isRunning) break; // exit if not running
if (pBar.Running)
bgworker_ProgressChanged(i);
semaphore.Release();
}
//...
t1.Interrupt();// make the worker thread catch the exception
}
//
void cancelButton_Click(object sender, EventArgs e)
{
isRunning = false; // optimistic stop
semaphore.Release();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)