Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.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# 新的wait关键字在高度并行的环境中有用吗?_C#_Async Await_Async Ctp_C# 5.0 - Fatal编程技术网

C# 新的wait关键字在高度并行的环境中有用吗?

C# 新的wait关键字在高度并行的环境中有用吗?,c#,async-await,async-ctp,c#-5.0,C#,Async Await,Async Ctp,C# 5.0,我可以在GUI应用程序中看到新的async和await关键字的有用性,在GUI应用程序中,添加一个线程来进行一些计算是必要的,而新的关键字确实使它变得简单。但是其他类型的应用程序呢 例如,执行某些工作的服务器或持续处理数据的进程?我可能仍然误解了新的关键字,但是这些类型的应用程序是否从新的关键字中受益,或者我们是否应该继续使用任务来实现更明确的多线程?wait和async是对任务的补充 您仍然应该使用任务,但是对它们使用await和async只会使任务的编写更简单 例如,执行某些工作的服务器或持

我可以在GUI应用程序中看到新的async和await关键字的有用性,在GUI应用程序中,添加一个线程来进行一些计算是必要的,而新的关键字确实使它变得简单。但是其他类型的应用程序呢


例如,执行某些工作的服务器或持续处理数据的进程?我可能仍然误解了新的关键字,但是这些类型的应用程序是否从新的关键字中受益,或者我们是否应该继续使用任务来实现更明确的多线程?

wait
async
是对任务的补充

您仍然应该使用任务,但是对它们使用
await
async
只会使任务的编写更简单

例如,执行某些工作的服务器或持续处理数据的进程

这在这里非常合适。例如,在WCF服务中,您可以使用async和Wait在单个异步请求中组合多个异步服务请求,而无需阻塞

可能是我仍然误解了新的关键字,但是这些类型的应用程序是否从新的关键字中受益,或者我们是否应该继续使用任务来实现更明确的多线程

这两个人合作得很好。Async和await通常使使用
Task
Task
的多个操作的处理和组合变得简单得多


但是,在“最低级别”,创建实际
任务的代码很可能会使用相同的基于TPL的技术。一旦有了创建
任务的方法,异步并等待使用该方法(包括使用它来生成更多异步方法,或使用它来生成同时运行多个任务的方法)变得简单得多。

任何时候,您计划调用一个最终将异步运行而不阻塞的方法时,对于回调方法,可以使用新的关键字使语法更简单。如果您没有任何回调代码,并且没有遵循延续传递的编程风格,那么新的关键字可能对您没有帮助。(这并不是说如果你真的…真的想使用它们,你就不能使用它们。)

在非GUI应用程序中,使用
wait
的主要优点是在进行I/O时

如果你是用“老办法”来做的话,你会使用同步方法来进行I/O,这会在线程工作时阻塞线程。使用
wait
,您没有阻塞线程,这意味着应用程序将使用更少的线程,这可能会导致更低的内存使用率(每个线程需要1 MB内存)和总体性能更好

您可以使用旧的异步编程模型实现类似的改进,但它要麻烦得多

如果您不在乎非GUI应用程序使用的线程超过了需要的数量,那么
wait
对您来说就没有多大用处了。但是如果你真的关心这一点,
wait
可以帮你很多忙

例如,执行某些工作的服务器或持续运行的进程 处理数据?可能是我仍然误解了新的关键词, 但是这些类型的应用程序是否从新的关键字或 我们是否应该继续使用任务来实现更明确的多线程

几个月前,当我第一次开始使用TAP时,我也遇到了同样的问题,并得出结论,TAP可以在并发的“服务器式”场景中很好地工作,而不必“下拉”到第三方物流的一些更本质的领域,等等

例如,我目前正在使用的应用程序(这是一个GUI应用程序,另外还使用TAP释放GUI线程)需要使用SSH与大量外部机器重复通信。想象一下,在一个大循环中,应用程序需要a)向每个外部机器发送一个“命令”文件,b)稍后轮询所有外部机器以获取“进度”文件(即使用SSH尝试下载文件),c)稍后轮询所有这些机器以获取“完成”文件,等等;这些步骤一次又一次地重复,直到我们“完成”

在这个应用程序的第一次编写中,所有这些SSH i/o都是同步完成的,每个步骤的累积时间太长。更不用说它的扩展性不好,因为我们要求该应用程序支持更多的外部机器

我已经重写了这个应用程序来同时执行这些步骤(上面提到的a、b、c)。因此,例如,向所有外部机器发送命令文件或多或少是同时进行的,而不是一个接一个地进行,这使得应用程序能够在这些步骤(a、b、c)之间更快地移动,并且随着我们添加更多外部机器而降低性能

我通过Task.Run()启动每个ssh操作,因为我使用的ssh库本身不提供“异步”功能(但库是线程安全的),然后我使用“wait Task.WhenAll(Task list)”等待所有这些功能。完成后,我检查每个任务,看看结果是什么,并据此进行

除了使用TAP使代码非常易于理解和查看之外,我还使用它对取消和进度对象的支持来处理取消并向用户报告这些活动的进度

到目前为止,这是非常好的工作,我没有任何“深入”到第三方物流,等等。一些人提到,当你“严重并发”,你可能不得不深入到第三方物流,但我个人还没有看到“为什么”

所以我想说,不要根据应用程序的“类型”(gui、服务器等)来确定TAP的有用性,而是根据您需要在应用程序中执行的活动的性质来确定;如果您需要同时进行多个计算,点击可以很好。如果您有大量需要执行的i/o