대기 없이 비동기 메서드 호출 #2
비동기식 메서드가 있습니다.
public async Task<bool> ValidateRequestAsync(string userName, string password)
{
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync(url);
string stringResponse = await response.Content.ReadAsStringAsync();
return bool.Parse(stringResponse);
}
}
저는 이 방법을 이렇게 부릅니다.
bool isValid = await ValidateRequestAsync("user1", "pass1");
사용하지 않고 동기식 방법에서 동일한 방법을 호출할 수 있습니까?await
키워드?
예:
public bool ValidateRequest(string userName, string password)
{
return ValidateRequestAsync(userName, password).Result;
}
저는 이것이 교착 상태를 야기할 것이라고 생각합니다.
편집
위와 같은 메소드를 호출하면 콜이 끝나지 않습니다. (메소드는 더 이상 끝에 도달하지 않습니다.)
UI 스레드와 같은 단일 스레드 실행 컨텍스트에서 비동기 메서드를 호출하고 동기적으로 결과를 기다리는 경우 교착 상태가 발생할 가능성이 높습니다.예제에서 확률은 100%입니다.
생각해 보세요.전화를 걸면 어떻게 됩니까?
ValidateRequestAsync(userName, password).Result
ValidateRequestAsync 메서드를 호출합니다.거기서 ReadAsStringAsync를 호출합니다.그 결과 작업이 UI 스레드에 반환되고 UI 스레드에서 계속 실행되도록 예약된 작업이 작업을 사용할 수 있게 되면 UI 스레드에서 계속 실행할 수 있게 됩니다.그러나 물론 작업이 완료될 때까지 대기(차단)되어 있기 때문에 결코 사용할 수 없습니다.그러나 UI 스레드를 사용할 수 있기를 기다리고 있기 때문에 작업을 완료할 수 없습니다.교착 상태.
이런 교착상태를 막을 수 있는 방법이 있지만 모두 '나쁜 생각'입니다.완전성을 위해서 다음과 같은 것이 효과적일 수 있습니다.
Task.Run(async () => await ValidateRequestAsync(userName, password)).Result;
이것은 좋지 않은 생각입니다. 왜냐하면 당신은 여전히 당신의 UI 쓰레드를 기다리고 있고 아무 유용한 일도 하지 않기 때문입니다.
그렇다면 해결책은 무엇일까요?비동기식으로 끝까지 가보세요.UI 스레드의 원래 호출자는 이벤트 핸들러일 수 있으므로 비동기인지 확인합니다.
당신은 사용할 수 있습니다.return ValidateRequestAsync(userName, password).GetAwaiter().GetResult();
저는 사용할 수 있었습니다.비동기 호출에서 대기(false) 설정을 구성합니다.저는 뭔가를 가지고 있습니다.
return await Entities.SingleOrDefaultAsync(.....).ConfigureAwait(false);
언급URL : https://stackoverflow.com/questions/19786441/call-async-method-without-await-2
'programing' 카테고리의 다른 글
C에서 댓글을 #정의할 수 있습니까? (0) | 2023.10.16 |
---|---|
ORM과 ODM의 차이점은 무엇입니까? (0) | 2023.10.16 |
이전 워드프레스 블로그 게시물 URL을 새 것으로 리디렉션하는 방법 (0) | 2023.10.16 |
JS를 통한 우커머스 변경 상품 변경 (0) | 2023.10.16 |
Oracle/SQL의 ROWID 데이터 유형 (0) | 2023.10.16 |