0

我有一個場景,我必須在學生列表中並行/獨立地運行學生列表。但是,當我用下面的代碼運行這些程序時,程序沒有正確完成就結束了。C#等待進程毫無例外地退出

public async Task ProcessStudents() 
{ 
    var students = await GetStudentsAsync().ConfigureAwait(false); 
    ProcessSingleStudent(students); 
} 

private static ProcessSingleStudent(IEnumerable<StudentModel> students) 
{ 
    students.ForEach(async student => 
    { 
     await ValidateSingleStudentAsync(student).ConfigureAwait(false); 
    } 
} 

private async Task ValidateSingleStudentAsync(StudentModel student) 
{ 
    //Do some validations here 
    if(validate) 
    { 
     var updated = await UpdateStudentAsync(student).configureAwait(false); //<== This cause issue 
    } 
} 

當我看到UpdateStudentAsync造成的問題,如果有F10去這個方法不返回任何東西,控制檯應用程序停止。即使我把每個電話都撥打try-catch我什麼都找不到。如果我進入每個調試點,我會得到預期的結果。

無法理解問題出在哪裏。

+0

哪裏是'UpdateStudentAsync'的代碼? –

+0

請分享調用'ValidateSingleStudentAsync'的代碼,並給我們提供關於主應用程序的更多信息,這意味着:如果'ValidateSingleStudentAsync'運行在臨時上下文中,則運行在Windows Form App或Console App上 –

+0

This是你需要的https://stackoverflow.com/a/39174582/782754 –

回答

1

您的ProcessSingleStudent不會等待每個調用的結果。因此,迭代

後終止你想是這樣的:https://stackoverflow.com/a/15136833/8302901

+0

你是對的,而不是在foreach中運行異步方法,我將返回的任務添加到任務列表中,然後將該任務列表傳遞給Task.WhenAll ()' – Kenz

0

記住,異步的await是會傳染或ProcessSingleStudent方法本身不是異步,它是同步的。你需要的是像

private async Task ProcessSingleStudent(IEnumerable<StudentModel> students) 
{ 
    await students.ForEach(async student => 
    { 
     await ValidateSingleStudentAsync(student).ConfigureAwait(false); 
    }).ConfigureAwait(false) 
} 

但是這是不可能的(它不會編譯)不具名AsyncEnumerator庫的一點點幫助。

代碼變得

private async Task ProcessSingleStudent(IEnumerable<StudentModel> students) 
    { 
     await students.ParallelForEachAsync(async student => 
     { 
      await ValidateSingleStudentAsync(student).ConfigureAwait(false); 
     }, 
     maxDegreeOfParalellism: 30, 
     cancellationToken: null, 
     breakLoopOnException: true 
     ).ConfigureAwait(false) 
    } 
+0

我不認爲第一個代碼塊可以在ForEach方法中添加await。 – Kenz

+0

不是,我說過。也許我沒有說清楚。 –