.NET 4.6';有什么意义;s任务完成任务
本文关键字:完成任务 任务 什么 NET | 更新日期: 2023-09-27 17:50:59
这篇博客文章提到了新的任务API,包括.NET 4.6中引入的新Task.CompletedTask属性。
为什么要添加此项?这怎么比Task.FromResult(whatever)
更好呢?
Task.FromResult(whatever)
适用于Task<TResult>
,但在4.6之前,不适用于非泛型任务。您可以使用带有伪值的FromResult
,并将其隐式转换为Task
,但这在一定程度上混淆了意图(您并没有真正返回任何异步值(,并在下面分配对象(而CompletedTask
可以缓存并在所有调用方之间共享(。
在当前(4.5.2及更早版本(的代码库中,自定义静态完成的任务并不少见,因此在我看来,将其纳入框架本身是有意义的。
Task.CompletedTask
属性在需要为调用方提供已完成的伪任务(不返回值/结果(时非常重要。这对于实现";接口";合同或测试目的。
Task.FromResult(data)
也返回一个伪Task,但这次返回的是数据或结果。你可能会这么做,因为你已经有了数据和无需执行任何操作即可获得。
示例-任务完成任务
public Task DoSomethingAsync()
{
return Task.CompletedTask; // null would throw exception on await
}
示例-Task.FromResult(数据(
public Task<User> GetUserAsync()
{
if(cachedUser != null)
{
return Task.FromResult(cachedUser);
}
else
{
return GetUserFromDb();
}
}
如果您想等待类中的函数,请使用task函数,然后返回task.CompletedTask。函数定义中不需要async。否则,您将为异步执行一些奇怪的代码,如awaittask.fyielt.
public class TaskCustom
{
public Task Function1Async(ITestOutputHelper output)
{
for (int i = 0; i < 10; i++)
{
output.WriteLine("reached fnc1 "+i.ToString());
}
return Task.CompletedTask; // null would throw exception on await
}
public Task Function2Async(ITestOutputHelper output)
{
for (int i = 0; i < 10; i++)
{
output.WriteLine("reached fnc2 " + i.ToString());
}
return Task.CompletedTask; // null would throw exception on await
}
}
public async Task TaskTestCompletedTask()
{
TaskCustom obj = new TaskCustom();
await obj.Function1Async(output);
await obj.Function2Async(output);
Assert.True(true);
}