相关疑难解决方法(0)

如何在Form的Closing事件中停止BackgroundWorker?

我有一个生成BackgroundWorker的表单,它应该更新表单自己的文本框(在主线程上),因此Invoke((Action) (...));调用.
如果HandleClosingEvent我只是做bgWorker.CancelAsync()然后我得到ObjectDisposedExceptionInvoke(...)电话,可以理解.但是,如果我坐在那里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)

c# multithreading backgroundworker winforms

66
推荐指数
1
解决办法
5万
查看次数

我需要杀死这样写的线程吗?还是会自动结束?

使用类似下面代码的代码,在函数返回后,新线程是否会自行结束?

new Thread(() =>
{
    function();
}).Start();
Run Code Online (Sandbox Code Playgroud)

我对线程很新,所以我想知道.

c# lambda multithreading thread-safety

20
推荐指数
1
解决办法
1364
查看次数

我无法阻止线程

我有以下代码,即使我关闭表单或退出程序,线程也不会停止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)

c# multithreading

2
推荐指数
1
解决办法
153
查看次数