[英]Running multiple tasks asynchronously and awaiting for their results c#
在我的服務層中,我想異步觸發多個方法並等待它們的結果。
我一次嘗試了一次,但出現了錯誤。
在服務類中,我將方法稱為
var _validChapterCodesTask = gd.validateChapterCodeDetails(_input1);
await Task.WhenAll(_validChapterCodesTask);
var _chapterCodeResult = await _validChapterCodesTask;
在DAL類中 ,方法定義看起來像
public async Task<IEnumerable<ChapterCodeValidationOutput>> validateChapterCodeDetails(GroupMembershipValidationInput gmvi)
{
Repository rep = new Repository();
if (!gmvi._chapterCodes.All(x => x.Equals("")))
{
var _validChapterCodes = await rep.ExecuteStoredProcedureAsync<Entities.Upload.ChapterCodeValidationOutput>(SQL.Upload.UploadValidation.getChapterCodeValidationSQL(gmvi._chapterCodes),null);
return _validChapterCodes;
}
else
return new List<ChapterCodeValidationOutput>();
}
錯誤信息
錯誤208
await
操作符只能在async
方法中使用。 考慮使用async
修飾符標記此方法,並將其返回類型更改為Task<ARC.Donor.Business.Upload.GroupMembershipValidationOutput>
。C:\\Users\\m1034699\\Desktop\\Stuart_Upgrade_2.1_New Approach\\Stuart_Export_Upload_v2.1\\Stuart Web Service\\ARC.Donor.Service\\Upload\\UploadValidationServices.cs 34 13 ARC.Donor.Service
排隊
await Task.WhenAll(_validChapterCodesTask);
var _chapterCodeResult = await _validChapterCodesTask;
我究竟做錯了什么 ?
該錯誤消息非常明確。 這是在告訴您您在使用Service類方法是錯誤地嘗試使用async
關鍵字。 為了解決此問題,您應該使用Stephen Cleary在MSDN上的帖子中定義的“一路異步”作為最佳實踐。
例如,如果您的服務類具有使用Task
或Task<T>
的方法主體,或者嘗試使用await
關鍵字,則此對應方法主體的方法簽名必須是async
(因為async
關鍵字啟用了方法使用await
關鍵字)。 另外,此方法本身也應該是Task
或Task<T>
返回,只有很少的例外。
就個人而言,我將更改您的DAL類以僅返回表示異步工作的操作,而無需實際等待它。 如果你想想看,在身體validateChapterCodeDetails
方法實際上並不需要的結果做任何事情,它只是需要返回他們(而不是去實現它們)。 考慮以下:
public Task<IEnumerable<ChapterCodeValidationOutput>>
validateChapterCodeDetails(GroupMembershipValidationInput gmvi)
{
var rep = new Repository();
return gmvi._chapterCodes.All(x => x.Equals(""))
? new List<ChapterCodeValidationOutput>()
: rep.ExecuteStoredProcedureAsync
<Entities.Upload.ChapterCodeValidationOutput>
(SQL.Upload.UploadValidation
.getChapterCodeValidationSQL(gmvi._chapterCodes),null)
}
由於您的Task<IEnumerable<ChapterCodeValidationOutput>>
變量已經在等待中,因此您可以訪問.Result
屬性以獲取所需的內容。 然后在您的Service類中,您的方法將如下所示:
public async Task ConsumeAsync()
{
var _validChapterCodesTask = gd.validateChapterCodeDetails(_input1);
await Task.WhenAll(_validChapterCodesTask);
var _chapterCodeResult = _validChapterCodesTask.Result;
// Do something with it...
}
這是一個.NET小提琴 ,應有助於更好地舉例說明這一點。
注意
我還要提醒您使用IEnumerable
因為它與您的回購有關,您應確保不會通過延遲執行來產生數據庫的結果,否則,您可能會面臨連接問題的風險,即; 意外地使連接保持打開狀態,或沒有正確關閉連接。
在您致電的Service
類中
var _validChapterCodesTask = gd.validateChapterCodeDetails(_input1);
await Task.WhenAll(_validChapterCodesTask);
var _chapterCodeResult = await _validChapterCodesTask;
將async
添加到方法簽名中await Task.WhenAll(_validChapterCodesTask);
叫做。 當此方法還具有返回類型時,您必須將此類型包裝在Task
如異常所示:
Task<ARC.Donor.Business.Upload.GroupMembershipValidationOutput>
例如,如果您具有以下方法:
public GroupMemberShipValidationOutput validate(..) {
...
await Task.WhenAll(_validChapterCodesTask);
...
}
您必須將方法簽名更改為:
public async Task<GroupMemberShipValidationOutput> validate(..) {
...
await Task.WhenAll(_validChapterCodesTask);
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.