簡體   English   中英

異步運行多個任務並等待其結果C#

[英]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上的帖子中定義的“一路異步”作為最佳實踐。

例如,如果您的服務類具有使用TaskTask<T>的方法主體,或者嘗試使用await關鍵字,則此對應方法主體的方法簽名必須是async (因為async關鍵字啟用了方法使用await關鍵字)。 另外,此方法本身也應該是TaskTask<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM