2012-12-14 59 views
2

MonoTouch 6.0中尚未提供C#异步等待功能。在此之前,在MonoTouch中实现异步任务的最佳方式是什么?在MonoTouch中实现可取消后台任务的最佳方式是什么?

MonoTouch文档推荐使用System.Threading命名空间中的线程来创建响应式UI。但是,一旦后台工作线程正在执行,如果需要很长时间,我该如何取消它?我是否需要在60秒内实现一个计时器,并在计时器事件触发时终止线程?

有更好的选择吗?

任何帮助,高度赞赏

感谢

回答

2

我不知道单声道多少有在这一点上CLR的,但对于后台任务,这里是我的名单,most-recommended first (full details on the rankings can be found on my blog)

  1. Task
  2. BackgroundWorker
  3. Delegate.BeginInvoke
  4. ThreadPool.QueueUserWorkItem
  5. Thread

对于 “解除标志”,我建议这些之一:

  1. CancellationToken - 金标准。如果可用,请使用它。
  2. ManualResetEvent
  3. volatile bool

取消本质上是合作,所以消除侧发送取消通知,在接收侧必须定期检查。

+0

谢谢你的伟大名单。我明白手动中止并不理想,但情况就是如此。 1. UI调用在“后台”线程服务器上的登录方法。 2. UI显示沙漏。 3。登录是一个阻塞呼叫,所以如何检查外部设置的中止标志?我正在阅读您的优秀博客帖子,并可能在那里找到答案。 – rams

+1

在这种情况下,我建议你做一个“合乎逻辑”的取消:在你设置取消通知后,就像取消一样。完成后,检查是否取消,如果取消,则忽略结果(或注销必须)。在这种情况下,我不会使用线程中止。 –

3

使用一个线程是一个不错的选择。但是,最好不要直接从外部终止(中止)线程。相反,在线程中运行的代码应该定期检查一个标志,并且如果该标志被设置为true,那么它应该早返回。

有一个很好的演练和样品在MSDN:

How to: Create and Terminate Threads

+0

感谢您的回复和链接。如果后台工作需要一段时间才能完成,我将不得不放弃该线程。 – rams

+1

@rams当我说'中止'时,我的意思是尽量不要使用Thread.Abort()来做终止。按照Stephen Cleary的回答,使用volatile bool或者ManualResetEvent来告诉线程它应该终止 – TheNextman

+0

除此之外,你应该放弃线程正在执行的操作,例如调用'HttpWebRequest.Abort()' - 大多数I/O和网络操作都有某种中止方法。 –

相关问题