我有一个生成BackgroundWorker的表单,它应该更新表单自己的文本框(在主线程上),因此Invoke((Action) (...));调用.
如果HandleClosingEvent我只是做bgWorker.CancelAsync()然后我得到ObjectDisposedException的Invoke(...)电话,可以理解.但是,如果我坐在那里HandleClosingEvent等待bgWorker完成,那么.Invoke(...)永远不会返回,也是可以理解的.
任何想法如何关闭此应用程序而不会出现异常或死锁?
以下是简单Form1类的3个相关方法:
public Form1() {
InitializeComponent();
Closing += HandleClosingEvent;
this.bgWorker.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
while (!this.bgWorker.CancellationPending) {
Invoke((Action) (() => { this.textBox1.Text = Environment.TickCount.ToString(); }));
}
}
private void HandleClosingEvent(object sender, CancelEventArgs e) {
this.bgWorker.CancelAsync();
/////// while (this.bgWorker.CancellationPending) {} // deadlock
}
Run Code Online (Sandbox Code Playgroud) 使用类似下面代码的代码,在函数返回后,新线程是否会自行结束?
new Thread(() =>
{
function();
}).Start();
Run Code Online (Sandbox Code Playgroud)
我对线程很新,所以我想知道.
我有以下代码,即使我关闭表单或退出程序,线程也不会停止System.Windows.Forms.Application.Exit();.
我的代码:
bool shouldStop = false;
private void button1_Click(object sender, EventArgs e)
{
backgroundThread = new Thread(
new ThreadStart(() =>
{
for (int j = 0; j <= 1000; j++)
{
if (!shouldStop)
{
//do something
}
else
{
break;
}
}
}));
backgroundThread.Start();
}
private void FormUpdateDB_FormClosing(object sender, FormClosingEventArgs e)
{
shouldStop = true;
}
Run Code Online (Sandbox Code Playgroud)