2

내가 사용하고 비동기 작업 방법 :비동기 및 대기 동작 메서드. 비동기로 작업하지 않습니다. 이유를 모르십니까?

public async Task<JsonResult> SetMaterialRequisitionNoteStatus(List<Guid> ids, string statusName, Guid statusId) 
{ 
    string resp = string.Empty; 
    resp = await note.GeneratePartLifeNotifications_ORN(repairNote, "Outsourced Repair Note " + statusName); 
    if (responce.ToLower() != "ok") 
    { 
     responce = responce.Replace("Workorder", "Outsource repair note"); 
     sendNotification(responce); 
    } 

    Utilities.SaveEntityInstance(note); 
    ...... 
} 

하지만 내 코드는 비동기 적으로 작동하지 않습니다. GeneratePartLifeNotifications_ORN 메서드에서 결과를 얻을 때까지 기다리는 전화 옆의 줄이 대기합니다. 동일한 동기 코드로 작동합니다. 비동기 동작을 원합니다.

+0

note.GeneratePartLifeNotifications_ORN (repairNote, "Outsourced Repair Note"+ statusName) 구현을 보여줄 수 있습니까? ? –

+0

하이 GeneratePartLifeNotifications_ORN 확장자 방법 –

+0

공공 정적 작업 GeneratePartLifeNotifications_ORN() {반환 작업 .Factory.StartNew (() => { 복귀 notifications.Count == 0 인 "OK": string.Join ("," 알림); }); –

답변

4

generatePartLifeNotifications_ORN 메서드에서 결과를 얻을 때까지 대기 호출 옆의 줄이 대기합니다.

글쎄, 무엇을 기대 했습니까? await은 해당 메소드를 비동기 적으로 실행하고 현재 스레드를 해제하여 다른 곳에서 작업을 수행합니다. 비동기 작업이 완료되면 스레드가 컴백하여 결과와 함께 함수 실행을 선택합니다 (사용자가 .ConfigureAwait(false)을 지정하지 않으면 스레드가 실행을 선택할 수 있음).

"대기"와 같은 의미이므로 실행은 해당 메서드가 완료 될 때까지 대기하지만 스레드는 다른 작업을하기 위해 대기하고 기다리지 않습니다.

동기식으로 실행하면 실행 순서는 같지만 호출 스레드는 차단되어 GeneratePartLifeNotifications_ORN이 완료 될 때까지 대기합니다. 비동기의 마술은 스레드가 웹 서비스 나 데이터베이스처럼 일어나는 것을 기다리는 대신에 뭔가 다른 것에서 작동하도록 허용하는 것입니다.

건배.

관련 문제