.NET 4.6';有什么意义;s任务完成任务

本文关键字:完成任务 任务 什么 NET | 更新日期: 2023-09-27 17:50:59

这篇博客文章提到了新的任务API,包括.NET 4.6中引入的新Task.CompletedTask属性。

为什么要添加此项?这怎么比Task.FromResult(whatever)更好呢?

.NET 4.6';有什么意义;s任务完成任务

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);
        }