gpt4 book ai didi

c# - 将 ValueTask 转换为非泛型 ValueTask

转载 作者:行者123 更新时间:2023-12-04 14:14:54 26 4
gpt4 key购买 nike

这里问的问题和one here是一样的并旨在为其创建一个最终的解决方案。最准确的答案是 Stephen Toub 自己在 this issue 中的回答。这正是关于这个问题。 “推荐代码”如下:

public static ValueTask AsValueTask<T>(this ValueTask<T> valueTask)
{
if (valueTask.IsCompletedSuccessfully)
{
valueTask.GetResult();
return default;
}

return new ValueTask(valueTask.AsTask());
}

这个答案不是最新的——ValueTask 不公开 GetResult()(只有一个 Result 属性)——问题是:

  • 我们是否需要将结果“拉”出 ValueTask(以“释放”可能在此 ValueTask 下运行的 IValueTaskSource)?
  • 如果是:
    • 是上面缺少的 .GetAwaiter() 调用吗?
    • 或者对属性的虚假调用是否保证有效 var fake = valueTask.Result;?总是? (怕死码淘汰。)
  • 如果不是,像下面这样的直接实现是否足够(且最佳)?
public static ValueTask AsNonGenericValueTask<T>( in this ValueTask<T> valueTask )
{
return valueTask.IsCompletedSuccessfully ? default : new ValueTask( valueTask.AsTask() );
}

最佳答案

该代码中缺少的是 .GetAwaiter():

public static ValueTask AsValueTask<T>(this ValueTask<T> valueTask)
{
if (valueTask.IsCompletedSuccessfully)
{
valueTask.GetAwaiter().GetResult();
return default;
}

return new ValueTask(valueTask.AsTask());
}

您说对了一部分,因为您不关心结果。但是您可能会关心抛出的异常或取消,如果您不查询结果,就会错过这些异常或取消。

或者你可以这样写:

public static async ValueTask AsValueTask<T>(this ValueTask<T> valueTask)
=> await valueTask;

关于c# - 将 ValueTask<T> 转换为非泛型 ValueTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61256813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com