0

我是 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 只会抛出异常并停止。

是因为我在第一次运行中中止了该过程吗?还是别的什么?还有其他方法吗?

4

2 回答 2

2

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

但是,您正在中止线程的事实是一个问题。当应用程序确实需要超过 2 秒时会发生什么。如果您要向用户展示,请稍候,它需要的时间比预期的要长。在if块中这样做是在哪里做的。.Join()即使线程无法加入,也不会停止线程。

编辑

在重写本节时,您可能需要考虑 2 个选项:

  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

任务似乎是您方案中的合适解决方案。

于 2014-06-08T07:50:46.043 回答
1

一种方法可能是考虑使用 Task 并从针对特定时间跨度(2 秒)实例化的 CancellationTokenSource 将 CancellationToken 传递给它。这样,当指定的时间过去时,传递给任务的 CancellationToken 将发出信号,然后可以采取适当的行动。

于 2014-06-08T08:04:27.150 回答