【发布时间】: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