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 
    } 
} 

내가 UpdateStudentAsyncF10 갈 경우이 방법은 아무것도 콘솔 응용 프로그램 중지를 반환하지 않습니다, 문제를 일으키는시피. 심지어 모든 전화를 걸었습니다 try-catch 나는 아무것도 찾을 수 없습니다. 각 디버그 지점에서 단계를 수행하면 예상되는 결과를 얻습니다.

어디에 문제가 있는지 알 수 없습니다.

+0

이됩니까? –

+0

'ValidateSingleStudentAsync'가 호출 된 곳에서 코드를 공유하고 주 응용 프로그램에 대한 자세한 정보를 제공하십시오. 즉, 'ValidateSingleStudentAsync'가 임시 컨텍스트로 실행중인 경우 Windows Form App 또는 Console 응용 프로그램에서 실행 중입니다. –

+0

This 무엇이 필요한지 https://stackoverflow.com/a/39174582/782754 –

답변

1

귀하의 ProcessSingleStudent는 foreach의 각 호출 결과를 기다리지 않습니다. 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라는 라이브러리의 약간의 도움없이 (이 컴파일되지 않습니다) 할 수 없습니다.

코드는`UpdateStudentAsync`의 코드가

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' 메소드를 기다리는 코드를 추가 할 수 없다고 생각합니다. – Kenz

+0

아니야, 내가 말했지. 어쩌면 나는 그것에 대해 분명히하지 않았다. –