停止一个线程,如果它花费太长时间
本文关键字:如果 长时间 线程 一个 | 更新日期: 2023-09-27 18:07:49
我是Windows Phone开发的新手,我正在尝试使用c#创建一个Windows Phone应用程序
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就会抛出一个异常并停止。
是因为我在第一次运行时中止了进程吗?还有别的吗?还有别的办法吗?
.Abort()
导致线程被完全销毁。如果您像示例中那样每次都生成一个新线程,那么它就可以工作。然而,如果你正在使用相同的t
对象,那么你需要创建一个新的线程对象,你不能在一个被中止的线程上运行.Start()
。
然而,你正在中止一个线程的事实是一个问题。当应用程序的运行时间超过2秒时会发生什么?如果你向用户显示,请等待,它花费的时间比预期的要长。在if
块中这样做是在哪里做的。.Join()
不会停止线程,即使它没有设法加入。
编辑
在重写本节时,您可能需要考虑两个选项:
- BackgroundWorker - http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx
- 线程任务- http://msdn.microsoft.com/en-us/library/windowsphone/develop/cc221403(v=vs.105).aspx
任务似乎是您的场景中合适的解决方案。
一种方法可能是考虑使用一个Task,并将一个CancellationToken从一个CancellationTokenSource中传递给它,该CancellationToken是针对特定的时间范围(2秒)实例化的。这样,当指定的时间过去时,传递给Task的CancellationToken将被发送信号,然后可以采取适当的操作。