c#异步操作 2021-08-02 C# 暂无评论 ### async和await > 意思就是,在方法名那里加上async修饰,再定义Task.Run(匿名函数),里面可以加上返回值。 需要里面数值的时候,在赋值那里用await修饰。不会造成ui线程阻塞 ``` c# private async void rdbtnPt_CheckedChanged(object sender, EventArgs e) { //异步获取数据 避免ui阻塞 var thread = Task.Run(() => { nzsc_hgq_2021Entities2 hgqDatatable = new nzsc_hgq_2021Entities2(); //查询字典表里面的所有数据 return hgqDatatable.pt_err_limit.Select(o => o).ToList(); }); List allPtErr = await thread; } ``` > Task.Factory.StartNew(); 也是开一个新的线程,但是,他是立即执行的,而上面那个有点像把方法保存起来,需要用的时候加上await就行了。 ***2022-03-07 Task的一些用法*** > 新姿势🤷♂️🤷♂️🤷♂️ Task自带了一些管理线程的方法 1. `WhenAll(Task[])`等待列表中所有的线程执行完毕,可以配合 await 返回的是T类型的数组, >顺便提一下,这个await是异步的线程,他不会阻塞主线程,但是他会阻塞它所在的线程 ``` c# var a = await Task.WhenAll(alltas); foreach (var o in a) { var aa = o as Dictionary; FileStream file = File.Create(Environment.CurrentDirectory + "/" + aa.Keys.ToArray()[0]); file.Write(aa.Values.ToArray()[0], 0, aa.Values.ToArray()[0].Length); file.Close(); } ``` 上面这个代码await这段代码会阻塞,不会立即执行foreach,但是不会阻塞UI线程,`你懂我意思吧.jpg👀` 2. `WhenAny(Task[])` 等待Task数组中最先完成的task对象。状态为`RanToCompletion`已经成功执行,通过这个对象可以直接获取到Result,就不需要再阻塞了。但是其他任务好像还会继续执行 3. `WaitAll和WaitAny`就是字面意思,不过返回的不是task对象而是数组的索引,感觉用到的地方很少,而且他会让线程里的Invoke语句阻塞,不知道为啥,用When*就没啥问题. 标签:学习, c#