C# async await 并行执行多任务

.NET 4.5之后版本提供了async 和 await关键字,让多线程的实现优雅了许多.尤其是网络通信时,妈妈再也不用担心我的程序界面会假死啦!~ 最近我一直在做一个网页抓取的程序,已经采集到了一大批要抓取的url存在了数据库中,目前单线程吭哧吭哧一天也抓不完几个. 便想到让await并行执行,在C#圣经上看了这一章,但是并没有提到如何让await并行执行,只好自己动手测试.   经过几番尝试,最终可用的demo代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Threading; namespace MultiAsyncTest1 { public partial […]

C#多线程避免用户界面死锁

在编写winform应用程序时,当主线程中要处理耗时任务时,往往会导致用户界面(以下称为UI)的假死,即UI不响应用户的鼠标,键盘等操作. 耗时任务有很多种,比如: 向远程服务器发送和请求数据(http,smtp等); 大量的运算(信号处理,大量数据处理等); 其他(暂时只遇过以上两种情况) 以前最常使用编程环境是LabVIEW,在LabVIEW中只要架构合理就可以避免UI假死情况的发生,我常用的架构是生产者-消费者循环(具体内容可参考NI Community).在这种架构中,事件的接收和处理是放在两个不同的线程中进行的,线程之间使用线程安全的队列进行通信,所以耗时任务的处理并不会影响UI的响应,只是任务处理结果的输出会有延时. 在C#中,也可以使用这种思想来避免UI假死,不过实现起来相对LabVIEW要复杂不少, 首先是要用户自己管理线程, 第二是在C#新版本中,界面控件只可以由创建它的线程对其进行修改,也就是说在主线程中创建的控件,只能由主线程进行修改,如果在其他线程中使用诸如 textBox.Text = "xxx";这样的语句是没有效果,并且会导致异常.这种问题需要使用dele […]