C# 什么';It’这是一个很好的实施a";停止/取消“;停止线程的按钮(该线程不是后台工作线程)

C# 什么';It’这是一个很好的实施a";停止/取消“;停止线程的按钮(该线程不是后台工作线程),c#,wpf,C#,Wpf,我有一个WPF应用程序,它可以与远程服务器进行大量对话,因此为了保持UI的良好性和响应性,我将这些操作放在第二个线程中。有一些可能(尽管不太可能)的情况下,线程会挂起,永远阻塞。有没有一种简单的方法可以实现一个不需要调用thread.Abort()的“cancel”按钮?我看到很多人建议不要使用它,我不想留下任何未发布的资源。也许是一种强制线程抛出异常的方法 我在标题中指定这不是后台工作程序,因为程序不使用这些。它已经用普通的旧线程编码了 我完全同意您需要修复损坏的部分的意见,因为这是真正的问题

我有一个WPF应用程序,它可以与远程服务器进行大量对话,因此为了保持UI的良好性和响应性,我将这些操作放在第二个线程中。有一些可能(尽管不太可能)的情况下,线程会挂起,永远阻塞。有没有一种简单的方法可以实现一个不需要调用thread.Abort()的“cancel”按钮?我看到很多人建议不要使用它,我不想留下任何未发布的资源。也许是一种强制线程抛出异常的方法


我在标题中指定这不是后台工作程序,因为程序不使用这些。它已经用普通的旧线程编码了

我完全同意您需要修复损坏的部分的意见,因为这是真正的问题,但如果您目前无法修复,则需要继续操作。如果您使用的是.Net 4.0,请使用任务库。您可以创建一个任务并向其传递一个将在不同线程上执行的操作。关键是您可以将取消令牌传递给该任务

如果您反复启动相同的操作,您还可以检查任务状态并对此采取措施

//this is just a sample
 if (myTask != null) //meaning it's still exe'ing your action
{
    if (myTask.Status == TaskStatus.Faulted) //there's some kind of a problem with exe'ing it
    myTask = null; // could reset to run the action again
    else
        return; //let the task finish
}

myTask = Task.Factory.StartNew (() =>
        {
            ExecuteUMyAction ();
        });

如果不希望线程挂起,请修复这些情况,使其不会挂起。什么情况下“只是挂起,永远阻塞”?修好那些!“也许是一种强制线程抛出异常的方法?”--thread.Abort就是这样做的。从根本上说,答案是:通过线程的合作,您可以以任何方式停止它。如果没有线程的合作,就没有安全的方法来做。你反对backgroundworker是因为它需要大量的重新编码,还是有backgroundworker无法处理的事情?