Thread.abort()和Thread.join()在c#windows应用程序中耗时较长

Thread.abort()和Thread.join()在c#windows应用程序中耗时较长,c#,c#-4.0,C#,C# 4.0,在我的c#windows应用程序中 我有两个按钮“导出”和“取消” 在我的导出按钮中,我正在将sql datatable导出到.csv文件。它在线程下运行 thrThreadExportProcess = new Thread(new ThreadStart(startExport)); thrThreadExportProcess.Start(); thrThreadExportProcess.IsBackground = true; 当其导出过程

在我的c#windows应用程序中

我有两个按钮“导出”和“取消”

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

thrThreadExportProcess = new Thread(new ThreadStart(startExport));
           thrThreadExportProcess.Start();
           thrThreadExportProcess.IsBackground = true;
当其导出过程正在运行时,用户点击此处的“取消”按钮,我将中止该线程,然后加入该线程并删除导出的文件

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

我的问题是为什么它会在某个时候挂断

这是“取消”按钮中的代码部分

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

请提供您有价值的建议。

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

发件人:

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


这是关于线程的文档。中止不能保证任何事情,应该避免。在这种特定情况下它挂起的原因取决于
startExport
方法中的代码

发件人:

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

以下是关于线程的文档。当线程处于本机代码中时,Abort()不会立即终止线程(例如,在I/O或网络上阻塞)。它只告诉线程尽快退出

因此,您的Thread.Join()基本上会等到您中止的磁盘/网络I/O完成

现在确实不鼓励使用Thread.Abort(),只要有可能,就应该使用.NET 4.5新的异步方法。您也不应该从GUI线程中使用Thread.Join()。

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

因此,您的Thread.Join()基本上会等到您中止的磁盘/网络I/O完成


现在确实不鼓励使用Thread.Abort(),只要有可能,就应该使用.NET 4.5新的异步方法。您也不应该从GUI线程中使用Thread.Join()。

线程运行点中有什么?我一直怀疑,如果这不足以迅速结束,它将等待。。等等……无论如何,不建议对线程调用Abort()。但是我认为你不必(不应该)在你加入()之后再加入它。嗨,BugFinder,我不明白你在问什么,线程运行点是什么?我一直怀疑,如果这不足以迅速结束,它将等待。。等等……无论如何,不建议对线程调用Abort()。但是我认为你不必(不应该)在你加入之后再加入它