Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';在win服务中使用async/await的优点是什么_C#_.net Core - Fatal编程技术网

C# 什么';在win服务中使用async/await的优点是什么

C# 什么';在win服务中使用async/await的优点是什么,c#,.net-core,C#,.net Core,我有许多win服务和控制台应用程序运行在task scheduler上, 由于netstandard 2.0和core.net将所有I/O调用都转换为异步,所以我的所有代码都是以异步/等待模式编写的,当我没有任何可以冻结的UI时,使用这种模式有什么好处吗?是的,有好处 假设您的服务中有一个I/O操作,从某个套接字获取数据需要3秒钟。使用Async/Await模式,您可以在这3秒钟内完成其他CPU绑定的工作,而不会阻塞线程 一些基本的例子 var obj = new Demo(); var tas

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

是的,有好处

假设您的服务中有一个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);
        }
    }
}
当我没有任何可以冻结的UI时,使用这种模式有什么好处吗

async
/
wait
的要点是释放线程。防止冻结UI是一个具体的例子:
async
/
await
可用于释放UI线程,因此它不会冻结

在其他情况下,释放线程是有帮助的。例如,对于web服务器,释放线程允许更大的可伸缩性

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


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

冻结的UI会立即向用户提供反馈,因此经常提到,类似的冻结后台进程也会为某人(进程)阻塞资源,尽管它不容易观察到。所以优势几乎是一样的(事实上,async UI post总是提到UI进程,只是去掉了UI这个词)?我的线程正在等待并阻止一个线程,任何应用程序都可以重用它吗?
1
2
3
4
5
IO Done
6
7
8
9