【发布时间】:2013-03-09 02:44:06
【问题描述】:
我已经阅读了How to wait for a BackgroundWorker to cancel? 的答案,但我找不到针对我的具体问题的解决方案:
我的应用必须加载大量数据,但在大多数情况下,应用启动后不会立即需要这些数据。
为了最大限度地减少用户实际请求数据时的延迟,我使用 BackgroundWorker 加载它,它在应用启动时启动。希望当用户请求数据时,BackgroundWorker 已经完成。
但是,在某些情况下,它可能没有。在这些情况下,我想等待加载完成,然后再向用户显示任何内容。
我能想到的所有技术都有竞争条件:例如,如果我设置了AutoResetEvent,当用户请求数据时我不能使用WaitOne(),因为AutoResetEvent 可能已经发出信号;如果我添加一个布尔值 loading_complete 标志并在调用 WaitOne 之前检查它,loading_complete 可能会在 ckecing 之后设置为 true,但在 WaitOne 调用之前,它永远不会返回......
有什么想法吗?
编辑:感谢@500-InternalServerError 的解决方案;使用ManualResetEvent 效果很好。感谢其他人的建议。
【问题讨论】:
-
如果您使用.net 4.0或以上版本,您可以使用
Task。 -
@HamletHakobyan 不幸的是,我正在使用适用于 Windows Phone 的 SilverLight,它没有
Task... -
好吧,只需在 RunWorkerCompleted 事件中启用一个按钮即可。
-
只需在启动后台工作程序之前使用手动重置事件,然后在主线程中等待。然后后台工作人员在完成唤醒主线程时设置它。
-
Wait 在这种情况下会立即返回,这应该是你想要的。
标签: c# multithreading