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

本文关键字:如果 长时间 线程 一个 | 更新日期: 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()不会停止线程,即使它没有设法加入。

编辑

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

  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

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

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