Вопрос

Я реализую метод Task<Result> StartSomeTask() и случается, что знает результат уже до того, как метод называется. Как мне создать Задачаu003CT> что уже завершено?

Это то, что я сейчас делаю:

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);

.Net 4.6 добавляет Task.CompletedTask Если вам нужен нередковый Task.

public static Task CompletedTask { get; }

Обходные пути для более старых версий .NET:

  • При нацеливании .NET 4.0 с Async Targeting Pack (или AsynCCTP) вы можете использовать TaskEx.FromResult вместо.

  • Чтобы получить неребные Task до .NET 4.6, вы можете использовать тот факт, что Task<T> происходит от Task и просто позвонить Task.FromResult<object>(null) или Task.FromResult(0).

Для задач без возврата .NET 4.6 добавил Task.complendedtask..

Это возвращает задачу, которая уже находится в TaskStatus.rantComlection. Это, вероятно, возвращает один и тот же экземпляр каждый раз, но документация предупреждает вас не рассчитывать на этот факт.

Если вы используете RX, альтернатива наблюдается. Возврат (результат) .totask ().

Задача вызова. Почему без каких-либо параметров вернется завершенная задача.

Task task = Task.WhenAll();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top