什么是实现“停止/取消”按钮来停止线程(不是后台工作者)的好方法

时间:2012-04-25 07:18:06

标签: c# wpf

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

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

1 个答案:

答案 0 :(得分:0)

我绝对同意你需要修复被破坏的评论,因为这是真正的问题,但如果你现在不能,并且需要继续运作。如果您使用的是.Net 4.0,请使用任务库。您可以创建一个任务并将其传递给将在不同线程上执行的操作。关键是你可以将取消令牌传递给该任务。

http://msdn.microsoft.com/en-us/library/dd997396.aspx

如果您反复触发相同的操作,您还可以检查任务状态并执行相关操作。

//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 ();
        });