繁体   English   中英

为什么要在 Task.Run 中使用 Async?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM