如果花费太长时间停止一个线程

时间:2014-06-08 07:45:14

标签: c# multithreading windows-phone-8 thread-abort

我是Windows Phone开发的新手,我正在尝试使用C#

创建一个Windows手机应用程序
Thread t = new Thread(doaheavywork);
t.Start();

if (!t.Join(1000)) // give the operation 1s to complete
{
    t.Abort();
}

我不能改变doaheavywork功能。

我只需要在1或2秒内输出结果,因为有时它可能会运行很长时间。

我读过使用abort是错误的方法。

我在PhotoChooserTask完成功能中使用上述内容。首次运行执行正常。也就是说,当我点击按钮选择照片时,doaheavywork功能不会超过1秒。但是,如果我第二次尝试,PhotoChooserTask只会抛出异常并停止。

是因为我在第一轮中止了这个过程吗?还是其他什么?还有其他办法吗?

2 个答案:

答案 0 :(得分:2)

.Abort()导致线程被彻底销毁。如果您每次都像在示例中一样生成新线程,那么它将起作用。但是,如果使用相同的t对象,则需要创建新的线程对象,不能在中止的线程上运行.Start()

然而,您正在中止线程的事实是一个问题。当应用程序花费超过2秒时会发生什么。如果您要向用户展示,请等待,其耗时超过预期。在if块中执行此操作即可。 <{1}}即使无法加入,也不会停止该线程。

修改

在重写此部分时,您可能需要考虑两个选项:

  1. BackgroundWorker - http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx
  2. 主题任务 - http://msdn.microsoft.com/en-us/library/windowsphone/develop/cc221403(v=vs.105).aspx
  3. 任务似乎是您方案中的合适解决方案。

答案 1 :(得分:1)

一种方法可能是考虑使用Task并从CancellationTokenSource传递一个CancellationToken,该CancellationToken是在特定的时间范围内实例化的 - 2秒。这样,当指定的时间过去后,将发信号通知传递给Task的CancellationToken,然后可以采取适当的操作。