[C#] 완료된 작업 생성 <T>

메서드를 구현하고 Task<Result> StartSomeTask()있으며 메서드가 호출되기 전에 이미 결과를 알고 있습니다. 이미 완료된 Task <T> 를 어떻게 만듭니 까?

이것이 내가 현재하고있는 일입니다.

private readonly Result theResult = new Result();

public override Task<Result> StartSomeTask()
{
    var task = new Task<Result>(() => theResult);
    task.RunSynchronously(CurrentThreadTaskScheduler.CurrentThread);
    return task;
}

더 나은 해결책이 있습니까?



답변

private readonly Result theResult = new Result();

public override Task<Result> StartSomeTask()
{
    var taskSource = new TaskCompletionSource<Result>();
    taskSource.SetResult(theResult);
    return taskSource.Task;
}


답변

.NET 4.5를 대상으로 할 때 다음을 사용할 수 있습니다 Task.FromResult.

public static Task<TResult> FromResult<TResult>(TResult result);

실패한 작업을 만들려면 다음을 사용하십시오 Task.FromException.

public static Task FromException(Exception exception);
public static Task<TResult> FromException<TResult>(Exception exception);

Task.CompletedTask일반이 아닌 .NET 4.6이 추가 됩니다 Task.

public static Task CompletedTask { get; }

이전 버전의 .NET에 대한 해결 방법 :

  • 비동기 타겟팅 팩 (또는 AsyncCTP)을 사용하여 .NET 4.0을 대상으로하는 경우 TaskEx.FromResult대신 사용할 수 있습니다 .

  • Task.NET 4.6 이전에 제네릭이 아닌 것을 얻으려면 or Task<T>에서 파생되어 Task호출 한다는 사실을 사용할 수 있습니다 .Task.FromResult<object>(null)Task.FromResult(0)


답변

반환 값이없는 작업의 경우 .NET 4.6에 Task.CompletedTask 가 추가 되었습니다 .

이미 TaskStatus.RanToCompletion에있는 작업을 반환합니다. 매번 같은 인스턴스를 반환하지만 문서는 그 사실에 의존하지 말라고 경고합니다.


답변

Rx를 사용하는 경우 대안은 Observable.Return (result) .ToTask ()입니다.


답변

Calling Task. WhenAll 매개 변수없이 완료된 작업을 반환합니다.

Task task = Task.WhenAll();


답변