C# foreach遇到async和await
生活随笔
收集整理的這篇文章主要介紹了
C# foreach遇到async和await
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一個簡單的列子,需要把一個集合的數據添加到數據庫中。
我先這樣寫了,然后報錯了
public async Task<IHttpActionResult> Test([FromUri]string name = ""){List<string> strList = new List<string>() { "測試", "測試1", "測試2", "測試3", "測試4", "測試5", "測試6", "測試7", "測試8" };strList.ForEach(async x =>{JkSystemname jk = await dbOracle.JkSystemnames.AsQueryable().FirstAsync(ee => ee.Name == x);if (jk == null){jk = new JkSystemname() { Name = x };dbOracle.JkSystemnames.Insert(jk);}});return await Task.FromResult(Ok(new { errcode = 0, errmag = "success" }));}?
兩個辦法解決循環里面不能使用異步
①把方法提出來,然后返回task,然后一起執行,這樣不會按順序執行
public async Task<IHttpActionResult> Test([FromUri]string name = ""){List<string> strList = new List<string>() { "測試", "測試1", "測試2", "測試3", "測試4", "測試5", "測試6", "測試7", "測試8" };IEnumerable<Task> tasks = strList.Select(x => TestAsync(x));//映射到一個可以遍歷的taskawait Task.WhenAll(tasks); //使用task.whenall 完成return await Task.FromResult(Ok(new { errcode = 0, errmag = "success" }));}/// <summary>/// 根據傳入的名稱,返回需要執行的task代碼/// </summary>/// <param name="name"></param>/// <returns></returns>public async Task TestAsync(string name){JkSystemname jk = await dbOracle.JkSystemnames.AsQueryable().FirstAsync(ee => ee.Name == name);if (jk == null){jk = new JkSystemname() { Name = name };dbOracle.JkSystemnames.Insert(jk);}}?
?
?
②擴展方法,一個個的執行
/// <summary>/// 使用異步遍歷處理數據/// </summary>/// <typeparam name="T">需要遍歷的基類</typeparam>/// <param name="list">集合</param>/// <param name="func">Lambda表達式</param>/// <returns></returns>public static async Task ForEachAsync<T>(this List<T> list, Func<T, Task> func){foreach (T value in list){await func(value);}} public async Task<IHttpActionResult> Test([FromUri]string name = ""){List<string> strList = new List<string>() { "測試", "測試1", "測試2", "測試3", "測試4", "測試5", "測試6", "測試7", "測試8" };//①先得到集合,然后一起執行//IEnumerable<Task> tasks = strList.Select(x => TestAsync(x));//映射到一個可以遍歷的task//await Task.WhenAll(tasks); //使用task.whenall 完成//②一步一步的循環await strList.ForEachAsync<string>(async x =>{JkSystemname jk = await dbOracle.JkSystemnames.AsQueryable().FirstAsync(ee => ee.Name == x);if (jk == null){jk = new JkSystemname() { Name = x };dbOracle.JkSystemnames.Insert(jk);}});return await Task.FromResult(Ok(new { errcode = 0, errmag = "success" }));}?
轉載于:https://www.cnblogs.com/Sea1ee/p/10624769.html
總結
以上是生活随笔為你收集整理的C# foreach遇到async和await的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux裸机安装nginx,linux
- 下一篇: 国内首款 FeliCa协议NFC读卡器芯