[英]Why to use Async inside Task.Run?
在处理一些代码时,我遇到了以下内容,
private void MyMethod()
{
var t = Task.Run(
async () =>
{
Foo.Fim();
await Task.Delay(5000);
});
t.Wait();
}
我们特意引入了 5 秒的延迟来让Fim()
完成它的工作。 需要引入延迟 - 想象这是调用第三方 API,它要求 5 秒的冷却时间。
我想了解这是否是等待操作完成的正确方法。 方法 1 与以下方法 2 有何不同? 还是有更好的方法来做到这一点? 我们所需要的只是延迟冷却时间并避免阻塞 UI。
private void MyMethod()
{
var t = Task.Run(
() =>
{
Foo.Fim();
Task.Delay(5000).Wait(); // some operation which takes 5 seconds.
});
t.Wait();
}
你需要的是一个节流器,一个方便的 class 用于实现一个是SemaphoreSlim
:
限制可以同时访问资源或资源池的线程数。
private SemaphoreSlim _myMethodSemaphore = new SemaphoreSlim(1);
private void MyMethod()
{
_ = Task.Run(async () =>
{
await _myMethodSemaphore.WaitAsync();
try
{
Foo.Fim();
}
finally
{
await Task.Delay(5000); // Impose the delay even in case of an exception
_myMethodSemaphore.Release();
}
});
}
请注意,此示例中没有Wait()
。 唯一的阻塞调用是Foo.Fim()
方法调用。 通过使此方法异步,您可以获得关于可伸缩性的完美解决方案: await Foo.FimAsync()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.