首页 / C# / c# – 等待后台线程完成
c# – 等待后台线程完成
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 等待后台线程完成,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1385字,纯文字阅读大概需要2分钟。
内容图文
很抱歉,如果这是重复的,但我不太确定我需要使用哪些术语来查找此问题的现有答案.
我正在尝试提高应用程序的启动性能,伪代码看起来有点像这样.
LoadBigFileFromDisk(); //slow
SetupNetwork(); //even slower
UseBigFileFromDisk();
我认为第一步是磁盘绑定,另一个是网络绑定(和更慢),我可以在后台线程中运行第一步(当前正在使用ThreadPool.QueueUserWorkItem,但不确定这是否是最好的方法)和稍微提高性能.
它有效,但令我担心的是,我依靠的第二步足够慢,第一步完成.
我知道我可以在某处设置一个_done布尔值!在那,但是有更优雅/惯用的解决方案吗?
(不是.Net 4.0,所以虽然我对基于任务的感兴趣,但我需要后备解决方案).
解决方法:
在“主类”中这样做:
ManualResetEvent mre = new ManualResetEvent(false);
在你的“主”方法中这样做:
// Launch the tasks
mre.WaitOne();
在完成任务时(就在返回之前:-))
mre.Set();
如果必须等待多个事件,在“main”中创建多个ManualResetEvent并将它们放入一个数组中,每个事件“连接”到其中一个任务,然后每个任务在完成时设置其事件.然后在你的“主要”你做:
WaitHandle.WaitAll(arrayOfManualResetEvents);
请注意,通过这种方式,您最多可以等待64个事件.如果你需要更多,还有另一种方法(注意你必须使用这最后一种方法,即使你在STA线程上,比如WinForm应用程序的主线程).
ManualResetEvent mre = new ManualResetEvent(false);
int remaining = xxx; // Number of "tasks" that must be executed.
// Launch tasks
mre.WaitOne();
在每项任务结束时
if (Interlocked.Decrement(ref remaining) == 0)
{
mre.Set();
}
只有最后一个任务会将剩余字段减少为0和mre.Set().
内容总结
以上是互联网集市为您收集整理的c# – 等待后台线程完成全部内容,希望文章能够帮你解决c# – 等待后台线程完成所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。