2

返回已完成Task对象的最佳方法是什么?

可以写Task.Delay(0),或Task.FromResult<bool>(true)其他。

但是最有效的方法是什么?

4

4 回答 4

4

Task.FromResult 将是最直接的。它还包括一些常见整数等的内置结果。但是,如果您的值不是“显而易见的”值(并且不会有内置处理)但很可能在您的场景中经常返回 - 那么您可以创建自己的将结果缓存在一个字段中(如果合适,可能是静态的) - 但缓存任务很重要,而不是结果本身。l - 否则每次只使用 Task.FromResult 。

于 2013-05-06T22:03:54.530 回答
4

Stephen Toub (MSFT) 的回答:

如果每次都想要一个新的 Task 对象,Task.FromResult 是最有效的。Task.Delay(0) 在其当前实现中将返回一个缓存任务,但这是一个实现细节。如果你想使用缓存任务,你应该自己缓存一个,例如 private static readonly Task s_completedTask = Task.FromResult(true); 然后使用 s_completedTask。

于 2013-05-06T22:01:32.697 回答
3

这是一个小演示,它显示了标记和未标记异步的方法之间的异常处理差异。

public Task<string> GetToken1WithoutAsync() => throw new Exception("Ex1!");

// Warning: This async method lacks 'await' operators and will run synchronously. Consider ...
public async Task<string> GetToken2WithAsync() => throw new Exception("Ex2!");  

public string GetToken3Throws() => throw new Exception("Ex3!");
public async Task<string> GetToken3WithAsync() => await Task.Run(GetToken3Throws);

public async Task<string> GetToken4WithAsync() { throw new Exception("Ex4!"); return await Task.FromResult("X");} 


public static async Task Main(string[] args)
{
    var p = new Program();

    try { var task1 = p.GetToken1WithoutAsync(); } 
    catch( Exception ) { Console.WriteLine("Throws before await.");};

    var task2 = p.GetToken2WithAsync(); // Does not throw;
    try { var token2 = await task2; } 
    catch( Exception ) { Console.WriteLine("Throws on await.");};

    var task3 = p.GetToken3WithAsync(); // Does not throw;
    try { var token3 = await task3; } 
    catch( Exception ) { Console.WriteLine("Throws on await.");};

    var task4 = p.GetToken4WithAsync(); // Does not throw;
    try { var token4 = await task4; } 
    catch( Exception ) { Console.WriteLine("Throws on await.");};
}
// .NETCoreApp,Version=v3.0
Throws before await.
Throws on await.
Throws on await.
Throws on await.

从当接口需要异步任务<T>时移动(和编辑),如何在没有编译器警告的情况下获取返回变量

于 2019-10-30T21:59:29.000 回答
2

我觉得我有点晚了。但是,我仍然想分享这个答案,以获得更新的版本。

如果要返回已完成的任务,则应使用以下内容

return Task.CompletedTask;

这也会自动将状态设置为RanToCompletion

于 2022-02-03T10:50:36.997 回答