【问题标题】:What's the advantage of using async/await in a win service在 win 服务中使用 async/await 有什么好处
【发布时间】:2019-04-26 04:02:36
【问题描述】:

我有许多在任务调度程序上运行的 win 服务和控制台应用程序, 由于 netstandard 2.0 和 core .net 将所有 I/O 调用转为异步,我的所有代码都编写为 async/await 模型,当我没有任何可以冻结的 UI 时,使用这种模式有什么好处吗?

【问题讨论】:

  • 冻结的 UI 会立即向用户提供反馈,因此经常被提及,类似的冻结后台进程也会阻塞某人(进程)的资源,即使它不容易观察到。所以优势几乎是一样的(其实async UI post都会提到UI流程,去掉UI这个词就好了)。
  • 应用可以阻止其他进程吗?我的线程正在等待并阻塞一个线程,任何应用都可以重用它?

标签: c# .net-core


【解决方案1】:

是的,有一个优势。

假设您的服务中有一个 I/O 操作需要 3 秒才能从某个套接字获取数据。使用 Async/Await 模式可以让您在这 3 秒内完成其他 CPU 密集型工作,而不会阻塞线程。

一些基本的例子

var obj = new Demo();
var task1 = obj.WaitForIO(); //Imagine this as a database call that takes 5 seconds to finish
var task2 = obj.DoSomethingElse(); //Imagine this as some CPU bound work eg: some calculations
await Task.WhenAll(task1,task2);

public class Demo
{
    public async Task WaitForIO()
    {
        await Task.Delay(5000); 
        Console.WriteLine("IO Done");
    }

    public async Task DoSomethingElse()
    {
        for(var i=1;i<10;i++)
        {
            Console.WriteLine(i);
            await Task.Delay(1000);
        }
    }
}

输出:

1
2
3
4
5
IO Done
6
7
8
9

【讨论】:

    【解决方案2】:

    当我没有任何可以冻结的 UI 时,使用这种模式有什么好处吗?

    async/await的意义在于释放线程。防止冻结 UI 就是其中一个具体示例:async/await 可用于释放 UI 线程,因此不会冻结。

    在其他情况下释放线程很有帮助。例如,对于 Web 服务器,释放线程可以提高可扩展性。

    在某些情况下,释放线程并没有那么有用。对于桌面应用程序,拥有一个额外的线程(或十个)并不是什么大不了的事,因为大多数桌面计算机都没有得到充分利用。特别是对于控制台应用程序,您希望阻塞主线程,否则应用程序会提前退出。但是,这并不是说async 不应该在控制台应用程序中使用;我有时使用它只是因为您可以像并行并发一样轻松地进行异步并发,特别是如果您调用的 API 是异步的。

    因此,虽然在某些情况下async 是一个明显的胜利,但在其他情况下它更像是一个判断电话。即使您确实确定异步代码对于您的 Win32 服务来说更易于维护,是否值得切换?这是你必须自己回答的问题。

    【讨论】:

      猜你喜欢
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      • 2019-01-18
      • 1970-01-01
      • 2014-02-09
      相关资源
      最近更新 更多