我是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只会抛出异常并停止。
是因为我在第一轮中止了这个过程吗?还是其他什么?还有其他办法吗?
答案 0 :(得分:2)
.Abort()
导致线程被彻底销毁。如果您每次都像在示例中一样生成新线程,那么它将起作用。但是,如果使用相同的t
对象,则需要创建新的线程对象,不能在中止的线程上运行.Start()
。
然而,您正在中止线程的事实是一个问题。当应用程序花费超过2秒时会发生什么。如果您要向用户展示,请等待,其耗时超过预期。在if
块中执行此操作即可。 <{1}}即使无法加入,也不会停止该线程。
修改强>
在重写此部分时,您可能需要考虑两个选项:
任务似乎是您方案中的合适解决方案。
答案 1 :(得分:1)
一种方法可能是考虑使用Task并从CancellationTokenSource传递一个CancellationToken,该CancellationToken是在特定的时间范围内实例化的 - 2秒。这样,当指定的时间过去后,将发信号通知传递给Task的CancellationToken,然后可以采取适当的操作。