繁体   English   中英

如果花费太长时间,则停止线程

[英]Stop a thread if it takes too long

我是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秒钟内将结果删除即可,因为有时它可能会运行很长时间。

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

我在PhotoChooserTask完整功能中使用以上功能。 第一次运行执行正常。 也就是说,当我单击按钮选择照片时,doaheavywork功能不会超过1秒。 但是,如果我第二次尝试,则PhotoChooserTask只会引发异常并停止。

是因为我在第一次运行中中止了流程吗? 还是其他? 还有其他方法吗?

.Abort()导致线程被完全破坏。 如果像示例一样每次都生成一个新线程,那么它将起作用。 但是,如果使用相同的t对象,则需要创建一个新的线程对象,因此无法在.Start()终止的线程上运行.Start()

但是,您正在中止线程这一事实令人担忧。 如果该应用程序花费了2秒以上的时间,将会发生什么情况。 如果您要向用户显示,请等待,所需时间比预期更长。 if块中执行此操作即可。 .Join()即使无法成功加入也不会停止线程。

编辑

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

  1. BackgroundWorker- http://msdn.microsoft.com/zh-cn/library/system.threading.tasks.task.aspx
  2. 线程任务-http: //msdn.microsoft.com/zh-cn/library/windowsphone/develop/cc221403(v=vs.105).aspx

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

一种方法可能是考虑使用一个Task,并从CancellationTokenSource传入一个CancellationToken,并在特定的时间间隔内实例化2秒。 这样,当指定的时间过去后,将向传递给Task的CancellationToken发出信号,然后可以采取适当的措施。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM