我创建了一种方法来收集应用程序的熵。
我将其放在一个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
,那么该警告就会消失。
答案 0 :(得分:0)
因为async
涉及到编译器重新编写您的方法,并且其作用之一是将返回值包装在Task
中。没有它,就不会发生重写,并且正如错误所言,byte[]
不是 Task<byte[]>
。
您可以在return
的每个点上写Task.FromResult()
。 1 进行自己的手动换行。
1 尽管一旦您删除了讨厌的catch
子句,该子句稍后将向您隐藏 错误,无论如何您将只有一个。