1

在我的 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);
            }

请提供您宝贵的建议。

4

2 回答 2

3

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

msdn 上的 Thread.Abort

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

这是有关创建和终止线程的文档

于 2012-10-03T07:34:07.357 回答
1

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

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

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

于 2012-10-03T07:34:57.987 回答