首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • [向net_lover提问]如何在BackgroundWorker Dowork进行并行数据处理 [已结贴,结贴人:Justforaword]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Justforaword
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-19 11:41:17 楼主
    如何在BackgroundWorker Dowork进行并行数据处理
    C# code
    worker = new BackgroundWorker(); worker.WorkerReportsProgress = true; worker.WorkerSupportsCancellation = true; worker.DoWork += new DoWorkEventHandler(worker_DoWork); worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged); worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); ////////////////////////////////////////////////// private void worker_DoWork(object sender, DoWorkEventArgs e) { if (worker.CancellationPending) return; foreach (XmlFormat xf in xmlList) { if (worker.CancellationPending) return; switch (xf.method.ToLower()) { case "upload": upload(xf); break; case "download": download(xf); break; default: return; } } } //////////////////


    也就是说,我要在foreach里面,并行处理各个xf,不必等每个xf结束才处理才一个问题,因为怕其中一个任务处理不了,全部挂住了
    所以必须采用并行处理,而不是串行处理.

    在每个foreach里面新增一个新线程是可以实现并行的,但是对于BackgroundWorker的事件报告会产生紊乱.所以不知道怎么用?麻烦各位高手献计献策,如果有什么疑问,可以写在回复上


    或者是不是可以通过重载OnDoWork方法,如果可以,又要怎么写呢?谢谢大家
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Justforaword
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 16:08:561楼 得分:0
    难道CSDN可以用了,没人知道吗?都没人来光顾我的帖子
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zlkingdom
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 10:05:262楼 得分:0
    先帮你顶一下
    你说的这个问题关键还是在于你的业务逻辑需要。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Macosx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 10:26:383楼 得分:0
    对于BackgroundWorker的事件报告会产生紊乱 是要报告完成的数据量吗
    得有一个线程管理其它xf的完成情况 每一个xf线程单独报告当然会出问题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mawering
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 10:46:004楼 得分:0
    帮顶,跟着学习一下!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhzuo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 15:51:575楼 得分:100
    楼主使用BackgroundWorker来实现应该是比较合适的处理方式,BackgroundWorker的实现原理是基于事件的异步处理模式。你在foreach循环中可以使用单独的线程(Thread)来执行upload或download方法。看你提供的代码应没有什么返回值吧,如果有而且需要显示到UI元素上,那么可以调用Control.BeginInvoke或Control.Invoke来跨线程更新UI元素。
    另外,你也可以在foreach循环中试一下实例化新的BackgroundWorker来执行upload或download方法,不过需要注意的是在该处实例化的BackgourndWorker对象线程上下文是在worker_DoWork方法的上下文,不同于UI线程,因此需要调用Control.BeginInvoke或Control.Invoke方法。

    下面一些文章可以给楼主排忧解难。
    使用BackgroundWorker组件进行异步操作编程
    http://blog.csdn.net/zhzuo/archive/2008/07/23/2699305.aspx
    实现增强的异步任务执行组件
    http://blog.csdn.net/zhzuo/archive/2008/07/23/2699847.aspx

    通过多线程为基于 .NET 的应用程序实现响应迅速的用户
    http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/misMultithreading.mspx
    为Windows应用创建简单的异步调用模式
    http://www.microsoft.com/china/MSDN/library/architecture/AsynCallPattern.mspx
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved