MonoTouch 6.0中尚未提供C#异步等待功能。在此之前,在MonoTouch中实现异步任务的最佳方式是什么?在MonoTouch中实现可取消后台任务的最佳方式是什么?
MonoTouch文档推荐使用System.Threading命名空间中的线程来创建响应式UI。但是,一旦后台工作线程正在执行,如果需要很长时间,我该如何取消它?我是否需要在60秒内实现一个计时器,并在计时器事件触发时终止线程?
有更好的选择吗?
任何帮助,高度赞赏
感谢
MonoTouch 6.0中尚未提供C#异步等待功能。在此之前,在MonoTouch中实现异步任务的最佳方式是什么?在MonoTouch中实现可取消后台任务的最佳方式是什么?
MonoTouch文档推荐使用System.Threading命名空间中的线程来创建响应式UI。但是,一旦后台工作线程正在执行,如果需要很长时间,我该如何取消它?我是否需要在60秒内实现一个计时器,并在计时器事件触发时终止线程?
有更好的选择吗?
任何帮助,高度赞赏
感谢
我不知道单声道多少有在这一点上CLR的,但对于后台任务,这里是我的名单,most-recommended first (full details on the rankings can be found on my blog):
Task
BackgroundWorker
Delegate.BeginInvoke
ThreadPool.QueueUserWorkItem
Thread
对于 “解除标志”,我建议这些之一:
CancellationToken
- 金标准。如果可用,请使用它。ManualResetEvent
volatile bool
取消本质上是合作,所以消除侧发送取消通知,在接收侧必须定期检查。
使用一个线程是一个不错的选择。但是,最好不要直接从外部终止(中止)线程。相反,在线程中运行的代码应该定期检查一个标志,并且如果该标志被设置为true,那么它应该早返回。
有一个很好的演练和样品在MSDN:
感谢您的回复和链接。如果后台工作需要一段时间才能完成,我将不得不放弃该线程。 – rams
@rams当我说'中止'时,我的意思是尽量不要使用Thread.Abort()来做终止。按照Stephen Cleary的回答,使用volatile bool或者ManualResetEvent来告诉线程它应该终止 – TheNextman
除此之外,你应该放弃线程正在执行的操作,例如调用'HttpWebRequest.Abort()' - 大多数I/O和网络操作都有某种中止方法。 –
谢谢你的伟大名单。我明白手动中止并不理想,但情况就是如此。 1. UI调用在“后台”线程服务器上的登录方法。 2. UI显示沙漏。 3。登录是一个阻塞呼叫,所以如何检查外部设置的中止标志?我正在阅读您的优秀博客帖子,并可能在那里找到答案。 – rams
在这种情况下,我建议你做一个“合乎逻辑”的取消:在你设置取消通知后,就像取消一样。完成后,检查是否取消,如果取消,则忽略结果(或注销必须)。在这种情况下,我不会使用线程中止。 –