문제

내가 읽기 해당, 게시물에 의해 스티븐 Toub.

public static Task RunAsync(Action action)
{
    var tcs = new TaskCompletionSource<Object>();
    ThreadPool.QueueUserWorkItem(_ =>
    {
        try
        {
            action();
            tcs.SetResult(null);
        }
        catch(Exception exc) { tcs.SetException(exc); }
    });
    return tcs.Task;
}

때문에 우리는 더 이상 무슨 상관의 유형 T 입니다,나는 기본값으로 사용하기 Object.그런 다음 경우 Action 이 성공적으로 실행, SetResult 여전히 사용하는 전환 TaskRanToCompletion 최종 상태그러나,이후 실제 결과 값이 없다. null 사용됩니다. 마지막으로, RunAsyncTaskTask<Object>.물론,인스턴스화 task'들은 여전히 유형 Task<Object>, 지만,우리에게 필요하지 않으로 그것을 참조 하십시오,그리고 소비자 이 방법의 필요에 대한 관심이 없는 그 구현세요.

나가지 못하는 이유를 이해하는 방법을 반환해야 합니다 TaskTask<object> (는 이유는 내가 강조되고 굵은 문장).나는 방법은 설정을 돌아 TasktcsTaskCompletionSource<Object>, 지 TaskCompletionSource (는 잘못이 나는 생각한다).

도움이 되었습니까?

해결책

가 없는 일반적인 비 TaskCompletionSource 고 고려하고 당신이 원하는 모든 작업,그 결과 결과는 중요하지 않습니다.발신자가 알지 못하고 걱정하지 않는 이 경우에는 작업이 실제로 Task<object>, 자만 awaits 고,얻으면 예외가 하나입니다.발신자의 인식이 실제 결과입니다.

이는 사실에 의해 촉진 Task<T> 에서 상속 Task


그것은 또한 일반적인을 찾을 수 Task<bool> 는 false 를 반환하거나, Task<int> 0.

다른 팁

이 없 아닌 일반 TaskCompletionSource 클래스의 인스턴스를 만들기 위한 Task 하지 않는 인스턴스 Task<T>.이 두 가지 옵션에 대한 일반적인 유형을 위한 매개변수 TaskCompletionSource<T> 할 때 걱정하지 않는다(거나 제공하지 않)반환 값:

  1. 사용하는 임의의 기존 등과 같은 형식 object, 으로 돌아 유형입니다.값을 설정 null 을 나타내는 작업을 완료.
  2. 사용 특정 비공개 형식 및 값을 설정 null 을 나타내는 작업을 완료.

를 만들 때 TaskCompletionSource<T> 인스턴스의 목적에 대한 제공 Task 는 반환 값이 없는,내가 선호하는 사용 전용 비 공용 유형을 보장하이 걸리는 코드는 실수하지 않을 것이다 돌아 Task 으로 인스턴스 Task<T> 치 결과는 의미가 있다.

첫째,정의는 다음과 같은 클래스(수 private sealed class 는 경우 그것은 중첩된 내에서 또 다른 유형):

internal sealed class VoidResult
{
}

그런 다음 대신 사용 TaskCompletionSource<object> 이 완료 원본,사용 TaskCompletionSource<VoidResult>.이후 VoidResult 입력하지 않은 액세스 코드를 호출하여,사용자가할 수 없습니다 캐스팅 Task 객체를 인스턴스 Task<VoidResult>.

나가지 못하는 이유를 이해하는 방법을 반환해야 합니다 TaskTask<object>

기 때문에 당신이 돌아 Task<Object> 그것이 의미하는 경우 이 메소드가 완료되면 생산됩니다 몇 가지 유용한 유형의 값 Object.이 경우에는 우리가 생성하지 않는 모든 결과,그 이유는 스테판을 선택하 return Task.

면 우리가 해결해야 할 문제 Func<Object> 그때로 돌아 Task<Object> 적절할 것으로 Func 생산됩니다 어떤 결과,우리는 반환하도록 선택할 수 있습니다.

TaskCompletionSource<Object>, 지 TaskCompletionSource?

이 없기 때문에 그런 것입니다.이 없 아닌 일반 TaskCompletionSource.

당신이 돌아 Task<object>, 다음 var result = await RunAsync(...) 항상 돌아 null, 이후,그것은 당신이 무슨 설정한 결과다.

클라이언트에 대해 상관 없이,그래서 당신은 단지 반환 Task.

이상적으로,당신은 당신을 사용하는 것 TaskCompletionSource 내부적으로 대 TaskCompletionSource<object>, 고,그냥 통화 같은 뭔가 SetCompleted()SetResult(null).그러나 이러한 형식이 존재하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top