Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建已完成的任务<;T>;_C#_.net_Task Parallel Library - Fatal编程技术网

C# 创建已完成的任务<;T>;

C# 创建已完成的任务<;T>;,c#,.net,task-parallel-library,C#,.net,Task Parallel Library,我正在实现一个方法Task StartSomeTask(),并且碰巧在调用该方法之前就知道了结果。如何创建已完成的项目 这就是我目前正在做的: private readonly Result theResult = new Result(); public override Task<Result> StartSomeTask() { var task = new Task<Result>(() => theResult); task.RunSyn

我正在实现一个方法
Task StartSomeTask()
,并且碰巧在调用该方法之前就知道了结果。如何创建已完成的项目

这就是我目前正在做的:

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();
公共覆盖任务StartSometTask()
{
var任务=新任务(()=>结果);
同步运行(CurrentThreadTaskScheduler.CurrentThread);
返回任务;
}
有更好的解决方案吗?

private readonly Result theResult=new Result();
private readonly Result theResult = new Result();

public override Task<Result> StartSomeTask()
{
    var taskSource = new TaskCompletionSource<Result>();
    taskSource.SetResult(theResult);
    return taskSource.Task;
}
公共覆盖任务StartSometTask() { var taskSource=new TaskCompletionSource(); taskSource.SetResult(结果); 返回taskSource.Task; }
以.NET 4.5为目标时,您可以使用:

如果需要非通用的
任务
,则.NET 4.6会添加

public static Task CompletedTask { get; }

较旧版本的.NET的变通方法:

  • 当使用异步目标包(或AsyncCTP)以.NET 4.0为目标时,您可以使用
    TaskEx.FromResult

  • 要获得.NET 4.6之前的非通用
    任务
    ,可以使用
    任务
    派生自
    任务
    的事实,只需调用
    任务.FromResult(null)
    任务.FromResult(0)


如果您使用的是Rx,则可以观察到另一种方法。Return(result).ToTask()。

对于没有返回值的任务,添加了.NET 4.6


它返回已处于TaskStatus.RanToCompletion状态的任务。它可能每次都返回同一个实例,但文档警告您不要依赖于这一事实。

调用Task.whall不带任何参数将返回已完成的任务

Task task = Task.WhenAll();

要返回非泛型任务,最好使用类似task.FromResult(0)的内容。使用“null”作为参数可能会使无法确定泛型参数的编译器感到困惑。异常情况如何?异步方法被编译成状态机,状态机捕获异常并将它们保存在返回的任务中。即使是在首次等待之前执行的代码也会发生这种情况。返回Task.FromResult的方法可能会直接抛出异常。@RobertVaž是一个有趣的边缘案例。可以说,如果您正在从一个方法检索已知结果,而该方法抛出异常,则存在一个需要修复的缺陷。@RobertVažan您可以轻松地编写自己的
FromException
方法,该方法的行为类似于
FromResult
,但表示一个错误的任务。如果异常在生成的task中表示很重要,那么这种方法可以简单地返回它的错误情况。task.FromException在.NET 4.5中不可用。。。我认为应该指定它。请注意,这个问题的答案对于创建普通任务(否)也很有效,因为任务继承自任务。请注意,今天对于已完成的任务有
ValueTask
(即,对于您已经拥有的值,代码基本上是同步的),这将为你节省一笔拨款。@DanielLobo如果你解释一下你的反对意见,你可能会得到一个答案,不是下面的那一个更简单,而且有更多的赞成票吗@user2023861虽然这会起作用,但它是一个模糊的解决方法,可能会让人们在阅读代码时感到困惑,因为它意味着等待不存在的任务
public static Task CompletedTask { get; }
Task task = Task.WhenAll();