1、有時候我們需要同時執行一些操作,然后把這些操作的結果進行匯總,以達到用異步處理降低操作耗時的效果,此時我們會考慮使用Task,而Task.WhenAll則排上了用場。
public void IssueStatistics() {
var task = GetIssueStatisticsAsync(); var dtRet = task.Result; }
private async Task<DataTable> GetIssueStatisticsAsync() { var taskList = new List<Task<DataTable>> { GetIssueDataAsync(), GetB2CIssueDataAsync() }; var tasks = taskList.ToArray(); var tables = await Task.WhenAll(tasks).ConfigureAwait(false); var retDt = orderDAL.CreateIssueDataTable(); for (int index = 0; index < tables.Length; index++) { for (int k = 0; k < tables[index].Rows.Count; k++) { retDt.ImportRow(tables[index].Rows[k]); } } return retDt; } private Task<DataTable> GetIssueDataAsync() { return Task.Run(() => { var dt = orderDAL.GetIssueDataOfOrder(); return dt; }); } private Task<DataTable> GetB2CIssueDataAsync() { return Task.Run(() => { var dt = orderDAL.GetIssueDataOfB2C(); return dt; }); }
這里有個地方需要注意的,如果不是在控制台應用程序,那么需要在Task.WhenAll后面加 ConfigureAwait(false),不然無法返回當前線程。
當然,按照官網的實例寫法,你也可以這樣寫:
private async Task<int> ExecuteDataAsync() { var dtRecord = _dao.GetDataOfStockOut(); var dataList = _comDao.ToSyncDataList(dtRecord); if (dataList == null) return 0; var tasksQuery = from data in dataList select DoRunIssueDataAsync(data); var tasks = tasksQuery.ToArray(); int[] flags = await Task.WhenAll(tasks); int total = flags.Sum(); return total; } private async Task<int> DoRunIssueDataAsync(SyncDataM data) { return await Task.Run(() => { //要處理的事情
return 1; }); }
這樣調用就可以了:
var task = ExecuteDataAsync(); task.Wait();