ImageVerifierCode 换一换
格式:DOC , 页数:9 ,大小:114KB ,
资源ID:2634117      下载积分:20 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-2634117.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(从Socket数据处理线程想到的普通Winform数据显示的应用.doc)为本站会员(dzzj200808)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

从Socket数据处理线程想到的普通Winform数据显示的应用.doc

1、从 Socket 数据处理线程想到的普通 Winform 数据显示的应用Posted on 2010-02-05 23:15 伍华聪 阅读(1618) 评论(8) 编辑 收藏 在前面介绍过 Socket 编程的文章中,有一篇是 Socket 开发探秘 -基类及公共类的定义 ,其中介绍了一个独立线程处理类,专门在一个独立的线程中处理 Socket 的数据包的。摘录前面的内容介绍一下:5、ThreadHandler,数据独立线程处理类对每个不同类型的数据(不同的协议类型) ,可以用独立的线程进行处理,这里封装了一个基类,用于进行数据独立线程的处理 上面的工作原理是这样的,每次收到数据后,系统把数据

2、扔给独立线程处理类,处理类放到一个队列 Queue 的列表中,每次从中弹出一个来处理,根据不同的协议头,分派到不同的线程来处理,这样可以提高响应速度,防止线程之间的阻塞,能够充分利用系统的资源。其实我们还可以把这个思想应用到日常的 Winform 开发中,有时候我们可能在处理一些比较费时的操作,可能是需要做一部分显示一部分,类似日常生活中的项目周报、月周报的场景,因为不可能等一个几年的项目完成后,你才告诉老板你的工作情况吧。借鉴 Socket 的数据处理方式,我在 Winform 程序中运用了这种数据处理方式,如我在采集赶集网的数据的时候,可以把采集到的部分数据扔给系统中的数据独立处理线程,让

3、他们爱怎么显示就怎么显示,程序不中断,继续乐此不彼的去采集内容去,然后继续这样做(每采集一部分仍出去一部分) ,直到采集完毕。代码 public class ThreadHandler/ / 处理数据线程/ Thread _Handlehread = null;private string _ThreadName = “;private Fifo _DataFifo = new Fifo();/ / 线程名字/ public string ThreadNameget return _ThreadName; set _ThreadName = value; / / 接收处理数据/ / publi

4、c virtual void AppendData(T data)if (data != null)_DataFifo.Append(data);/ / 数据处理/ protected virtual void DataThreadHandle()trywhile (true)T data = _DataFifo.Pop();DataHandle(data);catch(Exception ex)LogHelper.Error(ex);/ / 数据处理/ / public virtual void DataHandle(T data)/ / 开始数据处理线程/ public virtual v

5、oid StartHandleThread()if (_Handlehread = null)_Handlehread = new Thread(new ThreadStart(DataThreadHandle);_Handlehread.IsBackground = true;_Handlehread.Start();LogHelper.Info(string.Format(“ThreadHandler 线程-0 启动。 。 。 。 。“, _ThreadName);上面的是独立线程处理的基类,下面我们用一个子类继承他,方便代码逻辑的剥离封装:在下面的代码中,我根据不同的 Table 表内容

6、类型,放到不同的函数中进行处理,以便实现不同的显示方式。 代码public class TestDataHandleThread : ThreadHandlerpublic TestDataHandleThread()base.ThreadName = “测试数据操作处理线程“ ;public override void DataHandle(PreData data)tryif (data.Key = KeyType.PostAticle)if (!string.IsNullOrEmpty(data.Content.TableName)ThreadPool.QueueUserWorkItem

7、(new WaitCallback(Portal.gc.MainDialog.DisplayForm), data.Content);else if (data.Key = KeyType.ContactInfo)if (!string.IsNullOrEmpty(data.Content.TableName)ThreadPool.QueueUserWorkItem(new WaitCallback(Portal.gc.MainDialog.DisplayContactForm), data.Content);catch (Exception ex)LogHelper.Error(“TestD

8、ataHandleThread 测试数据操作处理线程异常:0“ + ex.ToString();下面代码是表的不同类型的枚举类和预处理数据格式定义。 代码 public enum KeyTypePostAticle, ContactInfo;/ / 预处理的数据/ public class PreDataprivate KeyType key;private DataTable content;public KeyType Keyget return key; set key = value; public DataTable Contentget return content; set co

9、ntent = value; public PreData(KeyType key, DataTable data)this.key = key;this.content = data;在实际的赶集网采集程序中,我需要每采集一个链接的内容后,就处理并显示,因此示例代码如下所示:代码 / / 获取网站发布内容,并添加到线程进行处理/ / / private void GetContent(Dictionary itemDict)foreach (string key in itemDict.Keys)DataTable dt = new DataTable(key);/标题解析,省略 N 行代码

10、/内容解析,省略 N+N 行代码/添加到线程进行处理Portal.gc.MainDialog.AddData(new PreData(KeyType.PostAticle, dt);代码 / / 添加消息数据,根据不同的消息类型分派到不同的线程处理/ / 消息数据public void AddData(PreData data)_testDataThread.AppendData(data);/ / 采用多线程方式显示内容数据/ / public void DisplayForm(object table)DataTable data = table as DataTable;FrmConte

11、nt content = FindDocument(data.TableName) as FrmContent;if (content = null)content = new FrmContent();content.TabText = data.TableName;content.Text = data.TableName; this.Invoke(new MethodInvoker(delegate()content.BindData(data, data.TableName);content.Show(this.dockPanel);); 好了,思路是思路,程序是程序,两者结合就是实践的证明,采集大量的网站连接的时候,在也不会出现主界面停顿或者假死的情况了。下面是我闲暇时间的练笔之作, 贴图以证方案之可行。在采集的时候,整个程序再也不会出现假死的情况,你还可以去处理其他工作的。另外,由于涉及了线程的处理工作,你还需要定时检测处理线程,如果线程有问题,还需要重启线程就可以了,这部分是属于线程检查优化的部分,不再介绍。

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报