首页 新闻 会员 周边

winform 多线程操作

0
悬赏园豆:20 [已关闭问题] 关闭于 2014-03-25 09:08

一个winfrom项目单独的一个小程序,要实现的功能 :通过一个地址url获取一些IP集合,然后将这些集合和数据库中已经存在的ip进行比较,如果不重复验证这些ip是否是有效的(这里是写好的一个方法),有效的话存入数据库,这个要求是通过创建线程来实现,大体上架构应该怎么写呢,莫有思路呀,求指导,不胜感激

小龙女-90hou的主页 小龙女-90hou | 初学一级 | 园豆:5
提问于:2014-03-21 15:13
< >
分享
所有回答(2)
0

界面上放置一个 TextBox,用于修改 URL,然后放置一个 BUTTON,添加 Click 事件响应,在响应函数里创建一个 BackgroundWorker 实例,然后把你的那些逻辑代码放到 BackgroundWorker 的 DoWorker 事件上。

Launcher | 园豆:45045 (高人七级) | 2014-03-21 15:19

嗯,是可以用backgroundworker控件,只不过它这个获取ip集合有两种方式,一种是你说的这种可以用这个控件来做的,另外一种方式就是直接读取配置文件里的url,来获取ip集合的

支持(0) 反对(0) 小龙女-90hou | 园豆:5 (初学一级) | 2014-03-21 15:23

嗯,是可以用backgroundworker控件,只不过它这个获取ip集合有两种方式,一种是你说的这种可以用这个控件来做的,另外一种方式就是直接读取配置文件里的url,来获取ip集合的,我的疑惑主要是在于,比如线程A用来获取ip集合,获取的ip集合还要进行判断是否重复,是否有效,然后存入数据库这块不知道怎么弄了

支持(0) 反对(0) 小龙女-90hou | 园豆:5 (初学一级) | 2014-03-21 15:25

@小龙女-90hou: 假设你得到了 ip 的集合为 List<IP> list,然后

list = list.Distinct().Where( o => { return IsIPValid(O);}).ToList();

然后:

 

StartSqlTransaction;

list.Foreach(o=> {

    cmd.CommandText = "update if not exist ......";  // 自己去搜下这个语句});

}

EndSqlTransaction;

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-03-21 15:34

@Launcher: 这个是用到了ling和事务来实现的吧,因为获取到的ip集合肯定很多,使用task类加多线程会不会更快一点呢,

支持(0) 反对(0) 小龙女-90hou | 园豆:5 (初学一级) | 2014-03-21 15:42

@小龙女-90hou: Parallel.For(0,list.Count, i =>{

...............

});

这只是简单的并行,效果不理想,你应该结合使用 sqlbulkcopy 方式:http://www.developerfusion.com/article/122498/using-sqlbulkcopy-for-high-performance-inserts/

然后使用 WriteToServerAsync 方法进一步提高性能。

 

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-03-21 15:56
0

其实可以用异步方式

lucika.zh | 园豆:62 (初学一级) | 2014-03-21 17:27

task类就是这种异步方式吧,可以说具体点吗

支持(0) 反对(0) 小龙女-90hou | 园豆:5 (初学一级) | 2014-03-21 17:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册