سؤال

أنا أقوم بتنفيذ طريقة 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 (أو ASYNCCTP) يمكنك استخدامها TaskEx.FromResult في حين أن.

  • للحصول على غير جنرال Task قبل .NET 4.6 ، يمكنك استخدام حقيقة أن Task<T> مستمد من Task واتصل فقط Task.FromResult<object>(null) أو Task.FromResult(0).

للمهام بدون قيمة إرجاع ، أضافت .NET 4.6 Task.completedTask.

إنه يرجع مهمة موجودة بالفعل في TaskStatus.Rantocoftion. ربما يعيد نفس الحالة في كل مرة ، لكن الوثائق تحذرك من عدم الاعتماد على هذه الحقيقة.

إذا كنت تستخدم RX ، فإن البديل يمكن ملاحظته. return (النتيجة) .Totask ().

استدعاء Task.Whenall بدون أي معلمات ستعيد مهمة مكتملة.

Task task = Task.WhenAll();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top