【问题标题】:How do I stop a thread when my winform application closeswinform应用程序关闭时如何停止线程
【发布时间】:2010-08-22 15:39:28
【问题描述】:

我有一个单例,它有一个正在运行的线程,用于从服务器获取记录。 但是当我停止我的 winform 应用程序时,线程会继续运行。我试图在我的单例中创建一个析构函数以在线程运行时中止它,但它对线程没有任何影响——我知道析构函数正在被调用。

我正在寻找有关在我的应用程序关闭时如何关闭线程的建议。 谢谢

C#、.net2

【问题讨论】:

标签: c# .net multithreading


【解决方案1】:

线程可以是:

  • 前台:将让您的程序保持活动状态,直到完成。
  • 后台:将在您关闭应用程序时终止。

创建线程时,默认为前台线程。

你可以这样改变:

Thread t = new Thread(myAction);
t.IsBackground = true;
t.Start();

【讨论】:

  • 关闭表单后后台线程是否结束?例如,假设我有多个表单,而在一个表单中我有一个线程。当表单关闭时,即使它处于无限循环中,线程也会终止吗?或者当应用程序退出时线程会结束(当 Main 完成处理时)?
  • @JT9 我刚测试过,在多表单应用程序中关闭表单时后台线程不会结束。
  • 如果主/启动窗体上使用线程怎么办?
【解决方案2】:

如果可能的话,最好的选择是合作取消。

当没有更多代码要执行时,线程会自动停止。因此,当用户关闭您的应用程序时,您设置了一个标志,指示您的线程应该停止。线程需要时常检查flag是否被设置,如果设置了则停止从服务器获取记录并返回。

否则,您可以推出自己的解决方案,例如

static bool isCancellationRequested = false;
static object gate = new object();

// request cancellation
lock (gate)
{
    isCancellationRequested = true;
}

// thread
for (int i = 0; i < 100000; i++)
{
    // simulating work
    Thread.SpinWait(5000000);

    lock (gate)
    {
        if (isCancellationRequested)
        {
            // perform cleanup if necessary
            //...
            // terminate the operation
            break;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多