【问题标题】:Thread.abort() and Thread.join() taking long time in c# windows applicationsThread.abort() 和 Thread.join() 在 c# windows 应用程序中花费很长时间
【发布时间】:2012-10-03 07:20:57
【问题描述】:

在我的 c# windows 应用程序中,

我有两个按钮导出和取消。

在我的导出按钮中,我将 sql 数据表导出到 .csv 文件。它在线程下运行。

thrThreadExportProcess = new Thread(new ThreadStart(startExport));
           thrThreadExportProcess.Start();
           thrThreadExportProcess.IsBackground = true;

当它的导出过程正在运行时,用户在这里点击取消按钮,我正在中止线程,然后加入线程并删除导出的文件。

当它加入线程时,应用程序会挂起一段时间然后它会运行。

我的问题是为什么它会挂断一段时间。

这里是取消按钮的部分代码。

if (thrThreadExportProcess.IsAlive)
            {
               thrThreadExportProcess.Abort();
               thrThreadExportProcess.Join();
               File.Delete(csvPath);
            }

请提供您宝贵的建议。

【问题讨论】:

  • 线程运行点有什么?我一直怀疑,如果检查没有足够快地结束,它会等待......然后等待......
  • 无论如何都不推荐在线程上调用 Abort()。但我认为你根本不必(不应该)加入()之后。
  • 嗨,BugFinder,我没有得到您的要求

标签: c# c#-4.0


【解决方案1】:

Thread.Abort() 在本机代码中不会立即终止线程(例如,在 I/O 或网络上阻塞)。它只是告诉线程尽快退出。

所以 Thread.Join() 基本上会等到您要中止的线程完成磁盘/网络 I/O。

现在真的不鼓励使用 Thread.Abort(),您应该尽可能使用 .NET 4.5 的新异步方法。您也不应该在 GUI 线程中使用 Thread.Join()。

【讨论】:

    【解决方案2】:

    Thread.Abort 不保证任何事情,应该避免。为什么在这种特定情况下挂起取决于startExport 方法中的代码。

    来自Thread.Abort on msdn

    不保证线程立即中止,或者根本不中止。如果线程在作为 abort 过程的一部分调用的 finally 块中执行无限量的计算,则可能会发生这种情况,从而无限期地延迟 abort。要等到线程中止,可以在调用 Abort 方法后在线程上调用 Join 方法,但不能保证等待会结束。

    这是Create and Terminate Threads上的文档

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-15
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多