2012-04-25 55 views
0

我有一个WPF应用程序,做了很多跟一个远程服务器的,所以要保持界面很好,响应速度很快,我把这些操作放在第二个线程中。有一些可能的但不太可能的情况,那个线程只会挂起,永远阻塞。有没有简单的方法让我实现一个“取消”按钮,不涉及调用thread.Abort()?我看到很多人建议不要使用它,而且我不想留下任何未发布的资源。也许一种强制线程抛出异常的方法?什么是实行“停止/取消”按钮来停止一个线程的好方法(即ins't后台工作)

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

+2

如果您不希望线程挂起,请修复这些情况,以免发生这种情况。 – 2012-04-25 07:19:50

+1

什么情况下,“只是挂起,永远阻止”?修复这些! – 2012-04-25 07:21:12

+0

@DavidSchwartz如果程序本身无法确定是否出现问题,那么需要用户做出决定。此外,在其他情况下,当程序需要停止线程本身(如连接错误,它需要重新建立连接并重新启动线程)我想用同样的取消方法 – cost 2012-04-25 07:24:48

回答

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