【问题标题】:Task<byte[]> method warns about implicit cast without asyncTask<byte[]> 方法警告没有异步的隐式转换
【发布时间】:2019-02-22 07:10:37
【问题描述】:

我创建了一种方法来为我的应用程序收集熵。
我把它放在一个任务中,为调用者提供一个异步操作。
我想在从传感器收集熵时避免永远循环,所以我使用了默认为使用 RNGCryptoServiceProvider.GetBytes() 方法的超时。

public Task<byte[]> GetEntropy1(int length)
{
    RNGCryptoServiceProvider entropyGen = new RNGCryptoServiceProvider();
    byte[] entropyBuffer = new byte[2048];

    try
    {
        semaphore.Wait();

        Task t = Task.Run(() =>
        {
            /* gather entropy from sensors */
        });

        if (!t.Wait(5000))
        {
            entropyGen.GetBytes(entropyBuffer);
        }
        return entropyBuffer;
    }
    catch (Exception)
    {
        return entropyBuffer;
    }
    finally
    {
        this.semaphore.Release();
    }
}

但我不明白为什么当我返回字节数组时,会收到关于隐式强制转换的警告。
无法将类型“byte[]”隐式转换为“System.Threading.Tasks.Task”

如果我在函数定义中使用async,那么该警告就会消失。

【问题讨论】:

  • 因为当你等待时,你得到了任务的结果(byte[]),没有它,你得到的是任务本身。这就是它的工作原理
  • “从传感器收集熵”是否返回任务?如果是这样,则等待它而不是使用 Task.Run。就目前而言,你的方法没有任何异步,所以使用任务没有意义。
  • 熵收集可能涉及while..loop(仍在调查中)。我想超时以避免它因任何原因不退出。
  • @Petaflop 那么通过在函数签名中使用async,但在我的方法中不使用await(),这允许我返回结果而不是Task对象?
  • @just_another_engineer async 关键字本身什么也不做。这个答案和斯蒂芬的博客链接可能会帮助您了解它是如何工作的:stackoverflow.com/a/14178317/6009117

标签: c# task


【解决方案1】:

因为async 涉及编译器重写您的方法,并且它所做的一件事 是将返回值包装在Task 中。没有它,就不会发生重写,正如错误所说,byte[] 不是 Task&lt;byte[]&gt;

您可以在每个return 点上写Task.FromResult()1 以进行自己的手动包装。


1虽然一旦你删除了讨厌的catch 子句,它只会隐藏你以后发现的错误,但无论如何你只会有一个。

【讨论】:

  • 我想我现在明白了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-08-26
  • 2011-07-23
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多