【问题标题】:What is the best way to implement cancellable background task in MonoTouch?在 MonoTouch 中实现可取消后台任务的最佳方法是什么?
【发布时间】:2012-12-14 10:11:06
【问题描述】:

C# 异步等待功能在 MonoTouch 6.0 中尚不可用。在此之前,在 MonoTouch 中实现异步任务的最佳方式是什么。

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

有更好的选择吗?

非常感谢任何帮助

谢谢

【问题讨论】:

    标签: multithreading xamarin.ios


    【解决方案1】:

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

    MSDN 上有一个很好的演练和示例:

    How to: Create and Terminate Threads

    【讨论】:

    • 感谢您的回复和链接。如果后台工作需要一段时间才能完成,我将不得不中止线程。
    • @rams 当我说“中止”时,我的意思是尽量不要使用 Thread.Abort() 来进行终止。根据 Stephen Cleary 的回答,使用 volatile bool 或 ManualResetEvent 向线程发出它应该终止的信号
    • 除此之外,您应该中止线程正在执行的操作,例如通过调用HttpWebRequest.Abort() - 大多数 I/O 和网络操作都有某种中止方法。
    • C# async 做了类似的事情:它通过调用 Abort() 方法中止当前运行的 IO/网络操作,并且后台线程必须通过定期检查一些标志来主动支持取消。它从不调用Thread.Abort() 硬中止。
    【解决方案2】:

    目前我不确定 Mono 有多少 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

    取消是合作性质的,所以取消方发送取消通知,接收方必须定期检查。

    【讨论】:

    • 感谢您提供的精彩清单。我了解手动中止并不理想,但情况就是这样。 1. UI 在“后台”线程上调用服务器上的登录方法。 2. UI 显示沙漏。 3. 登录是一个阻塞调用,所以我如何检查外部设置的中止标志?我正在阅读您出色的博文,可能会在其中找到答案。
    • 在这种情况下,我建议您进行“合乎逻辑”的取消:设置取消通知后,就像取消通知一样。当它完成时,检查是否取消,如果它被取消然后忽略结果(或者你必须注销)。在这种情况下我不会使用线程中止。
    猜你喜欢
    • 2014-08-27
    • 1970-01-01
    • 2020-09-21
    • 2011-05-06
    • 2015-10-01
    • 1970-01-01
    • 2010-09-22
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多