메서드를 구현하고 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 이전에 제네릭이 아닌 것을 얻으려면 orTask<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();