之前在工作中一直用的是同步线程,就是先进入画面的load事件,然后在里面进行数据库调用的处理。后面又遇到了公司软件中一些比较古老的代码,一开始在那块古老代码中增加机能的时候,我想用到数据库的数据给画面赋上某些值,然后按照之前的常规方法去弄,发现不可以。询问了前辈,发现是异步的方式解决的。前辈说异步对于用户的感官上是最理想的,后面用同步线程是因为软件比较复杂,而且涉及的数据比较庞大,部分机能如果拿不到前面取得数据,是完全不可以进行下去的,所以用异步解决显得特别繁琐,然后改用了同步线程。
同步:方法名(BLL层,BLL层的方法,dto),形成画面与取数据:A-A1-B-B1-A2,UI线程是A系列,取数据是B系列,同步的话就是在UI线程顺序执行的过程中放入取数据的线程,不取完数据UI线程是没有办法结束掉的。
异步:方法名(BLL层,BLL层的方法,画面层的异步方法,dto),形成画面与取数据:A-A1----------A2,在省略号出与A1并列插出一条新的线程B-B1,然后到A2之前拿到B1的数据,最后执行完整个流程。一开始我以为异步就是A系列一条线程,B系列一条线程,两者是互不干扰的,然后前辈告诉我并不是这样的,A系列执行完之前还是要B系列最终的数据,否则整个线程不会结束。所以我用异步做弹出一个新的画面顺带还要把数据立即显示在画面的这个机能的时候,画面上有个grid数据表,用来显示数据的,会出现一个看着比较让人难过的现象,就是画面弹出来的瞬间,grid上的数据显示出来的时候,grid表本身会抖动一下,就是从空白到填充数据的瞬间,然后结束整个事件,这是完全符合刚刚描述A与B系列的流程的。
所以自己在完成这个机能,个人觉得在涉及到画面与数据的时候还是同步给人的感觉更好。。
后面回去学习总结的时候,又了解了C#5.0中两个新的关键字,也是关于异步线程的,await和async,这两个关键字是一对双胞胎的感觉,缺一不可,
static void Main(string[] args)
{
DisplayValue();
Console.WriteLine("AddValueAsync Start!");
Console.ReadLine();
}
static Task<int> AddValueAsync(int num1, int num2)
{
return Task.Run(() =>
{
return num1 + num2;
});
}
static async void DisplayValue()
{
Console.WriteLine("Programme Start!");
Console.WriteLine("*********************************");
double result = await AddValueAsync(1, 2);
Console.WriteLine("Value is : " + result);
Console.WriteLine("AddValueAsync End!");
Console.WriteLine("*********************************");
}
执行结果是:
Programme Start!
*********************************
AddValueAsync Start!
Value is : 3
AddValueAsync End!
*********************************
一开始学习的这两个关键字的时候,以为程序的执行结果会是:
AddValueAsync Start!
*********************************
Programme Start!
Value is : 3
AddValueAsync End!
*********************************
最后发现自己一开始设想的结果是完全错误的,async修饰的方法根本不会立刻异步掉,当进入一个async修饰的方法里面时,遇到的第一个await关键字修饰的方法时,才回回到主线程继续执行,而await后面的则会额外开一个线程执行。当然在VS里面进行单步调试的时候,打下面两个方法的断点,会发现不会回到mian方法里面执行 Console.WriteLine("AddValueAsync Start!")这句话,发现整个进程会一直往下走,然后弹出命令控制窗口结束掉。但是在出结果的时候,会发现它还是执行了。如果AddValueAsync再用async修饰,里面再嵌套await方法,最后线程会出现重复利用,假设有方法1,2,3,方法1是线程1,方法2还是线程2,但是方法3不会是线程3,而是线程1。
新人第一次总结学习笔记,如果有不对的地方,热烈欢迎指出错误的地方,谢谢~~~