Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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# .NETAsync和GoogleGo轻量级线程之间的主要区别是什么_C#_.net_Asynchronous_Go_.net 4.5 - Fatal编程技术网

C# .NETAsync和GoogleGo轻量级线程之间的主要区别是什么

C# .NETAsync和GoogleGo轻量级线程之间的主要区别是什么,c#,.net,asynchronous,go,.net-4.5,C#,.net,Asynchronous,Go,.net 4.5,在go中调用runtime.GOMAXPROCS(1)时,运行时将仅为所有goroutine使用一个线程。在执行io时,您的goroutine将让步,并让其他goroutine在同一线程上运行 如果不使用后台线程,.NETAsyncCTP特性如何实现协作并发,这与我的想法非常相似 我的问题是,你认为一种方法比另一种方法有哪些优点或缺点。做出价值判断总是一件棘手的事情,因此我将强调三个不同之处。你决定他们是属于“赞成”还是“反对”的范畴 虽然Go和async都允许您以简单的方式编写异步代码,但在.

在go中调用runtime.GOMAXPROCS(1)时,运行时将仅为所有goroutine使用一个线程。在执行io时,您的goroutine将让步,并让其他goroutine在同一线程上运行

如果不使用后台线程,.NETAsyncCTP特性如何实现协作并发,这与我的想法非常相似


我的问题是,你认为一种方法比另一种方法有哪些优点或缺点。

做出价值判断总是一件棘手的事情,因此我将强调三个不同之处。你决定他们是属于“赞成”还是“反对”的范畴

  • 虽然Go和async都允许您以简单的方式编写异步代码,但在.NET中,您必须知道代码的哪部分是异步的,哪部分不是(即,您必须显式使用async/Wait关键字)。在Go中,您不需要知道——运行时使其“正常工作”,没有特殊语法来标记异步代码

  • Go设计不需要标准库中的任何特殊代码。NET要求为每个异步操作向标准库中添加新代码,实际上,在这些情况下,API表面增加了一倍。例如,有新的异步http下载API,而旧的非异步http下载API必须保留以实现向后兼容性

  • Go的设计和实现要简单几个数量级。一小段运行时代码(调度器)负责挂起阻塞系统调用的goroutine,并让位于休眠goroutine。标准库中不需要任何特殊的异步支持

  • .NET实现首先需要添加上述新API。此外,.NET实现是基于编译器使用async/await将代码重写为等效的状态机。它非常聪明,但也相当复杂。实际结果是,第一个异步CTP在Go的实现几乎从一开始就在工作时就已经知道了bug


    最终,这并不重要。async/await是在.NET中编写异步代码的最佳方法。Goroutines是实现这一目标的最佳方式。这两种语言都很好,尤其是与大多数其他语言的备选语言相比。

    非常好的回答,谢谢。对于一些需要在两种语言之间进行选择的人,我更多地考虑执行速度性能。我不确定我是否同意。您可以使用C#和Java编写go风格的Goroutine,方法是使用每个进程的线程(通道只是同步队列)。在许多情况下,您并不关心In-Go-goroutine跨几个操作系统线程进行多路复用的事实。C#async向您承诺,某些代码将在同一操作系统线程中运行,这对于UI线程来说非常好。使用go无法获得这样的承诺。@Elazar:对于确保在UI线程上运行的特定情况,您可以在go()中使用LockOSThread()。没有太多细节,你的评论是误导性的。您希望WAIT语句的主体在非UI线程上运行,以便IO上的长时间计算或阻塞也不会阻塞UI线程。有时,出于线程安全考虑,您必须在UI线程上运行代码的其余部分。wait使这样的代码易于编写。在Go中,Go语句也有同样的功能,您可以协调UI线程与通道上的消息。@Kugel:在Go中使用wait/async没有意义,就像在C#中使用Go的Go语句没有意义一样。这些都是需要编译器和运行时支持的语言级功能。这两种语言都不够灵活,无法从另一种语言复制这样的基本设计。他们不一定是。async/await是编写正常并发代码的C#解决方案。Goroutines是Go对同一问题的解决方案。使用给定语言提供的最佳解决方案,而不是从另一种语言中寻找解决方案的精确副本。@KrzysztofKowalczyk:我最后一句话太苛刻了。我应该说“围棋很难做到这一点”。在LockosThreadWiki中:“Go的运行时为此提供了LockOSThread()函数,但众所周知,它很难正确使用”。Go在背后管理OS线程,因此很难控制哪个函数在哪里运行。通常这是一个好主意,但有时您关心哪些操作系统线程运行什么。我不明白我的评论有什么误导性。据我理解,C#wait就像在一个线程上运行一组goroutine。你不可能那么容易进入围棋。