program tip

콜백 기반 비동기 메서드를 대기 가능한 작업으로 변환하는 가장 좋은 방법

radiobox 2020. 11. 22. 19:18
반응형

콜백 기반 비동기 메서드를 대기 가능한 작업으로 변환하는 가장 좋은 방법


콜백을 사용하는 "클래식"비동기 메서드를 (대기 가능한) 작업을 반환하는 것으로 변환 / 래핑하는 가장 좋은 방법은 무엇입니까?

예를 들어 다음과 같은 방법이 있습니다.

public void GetStringFromUrl(string url, Action<string> onCompleted);

작업을 반환하는 메서드로 이것을 래핑하는 유일한 방법은 다음과 같습니다.

public Task<string> GetStringFromUrl(string url)
{
     var t = new TaskCompletionSource<string>();

     GetStringFromUrl(url, s => t.TrySetResult(s));

     return t.Task;
}

이것이 이것을 달성하는 유일한 방법입니까?

그리고 작업 자체에서 GetStringFromUrl (url, callback)에 대한 호출을 래핑하는 방법이 있습니까 (즉, 호출 자체가 동기식 대신 작업 내에서 실행 됨)


귀하의 코드는 짧고 읽기 쉽고 효율적이므로 대안을 찾는 이유를 이해하지 못하지만 아무것도 생각할 수 없습니다. 귀하의 접근 방식이 합리적이라고 생각합니다.

또한 동기 부품이 원본 버전에서는 괜찮다고 생각하는 이유도 모르겠지만 Task기반 버전에서는이를 피하고 싶습니다 . 동기 부품이 너무 오래 걸릴 수 있다고 생각되면 두 버전의 메서드에 대해 수정하십시오.

그러나 버전 ThreadPool에서만 비동기 적으로 (즉에서 ) 실행 Task하려면 다음을 사용할 수 있습니다 Task.Run().

public Task<string> GetStringFromUrl(string url)
{
    return Task.Run(() =>
    {
        var t = new TaskCompletionSource<string>();

        GetStringFromUrl(url, s => t.TrySetResult(s));

        return t.Task;
    });
}

콜백이 성공적인 상황 만 처리한다고 가정하면 가정 된 구현은 완벽하게 괜찮습니다. GetStringFromUrl 구현의 비동기 토대 내에서 예외가 발생하면 현재 어떻게됩니까? 그들이 그것을 Action 콜백에 전파 할 실제 방법이 없습니다. 그들은 그것을 삼키고 당신에게 null이나 무언가를 반환합니까?

내가 권장하는 유일한 방법은 XXXAsync 접미사를 사용하여 이러한 비동기 메서드의 이름을 지정하는 새로운 규칙을 따르는 것입니다.

참고 URL : https://stackoverflow.com/questions/11879967/best-way-to-convert-callback-based-async-method-to-awaitable-task

반응형