إنشاء مهمة مكتملة
-
27-09-2019 - |
سؤال
أنا أقوم بتنفيذ طريقة 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();