Task <byte []>方法警告没有异步的隐式强制转换

时间:2019-02-22 07:10:38

标签: c# task

我创建了一种方法来收集应用程序的熵。
我将其放在一个Task中,以为调用者提供异步操作。
在从传感器收集熵时,我想避免永远循环,因此我使用了默认使用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,那么该警告就会消失。

1 个答案:

答案 0 :(得分:0)

因为async涉及到编译器重新编写您的方法,并且其作用之一是将返回值包装在Task中。没有它,就不会发生重写,并且正如错误所言,byte[] 不是 Task<byte[]>

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


1 尽管一旦您删除了讨厌的catch子句,该子句稍后将向您隐藏 错误,无论如何您将只有一个。

1 >