Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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# 线程的异步委托_C#_Multithreading_Asynchronous - Fatal编程技术网

C# 线程的异步委托

C# 线程的异步委托,c#,multithreading,asynchronous,C#,Multithreading,Asynchronous,使用线程时,使用异步委托是否合乎逻辑?例如,假设我们有一个WCFSOAP服务,我们有一个使用WCF服务的客户端桌面应用程序。在这个应用程序中,我们需要同步和异步机制,所以有时我们需要使用线程,有时需要使用异步任务。现在假设我们需要在线程中使用WCF服务,那么我们可以用以下两种形式编写线程: Thread Worker = new Thread (()=>{ WCFServerClient client = new WCFServiceClient(); var GetDat

使用线程时,使用异步委托是否合乎逻辑?例如,假设我们有一个WCFSOAP服务,我们有一个使用WCF服务的客户端桌面应用程序。在这个应用程序中,我们需要同步和异步机制,所以有时我们需要使用线程,有时需要使用异步任务。现在假设我们需要在线程中使用WCF服务,那么我们可以用以下两种形式编写线程:

Thread Worker = new Thread (()=>{
    WCFServerClient client = new WCFServiceClient();
    var GetData = client.GetData(new GetDataRequest());
});

Thread Worker = new Thread (async ()=>{
    WCFServerClient client = new WCFServiceClient();
    var GetData = await client.GetDataAsync(new GetDataRequest());
});

哪一个更符合逻辑?我的意思是,选择第二种选择有意义吗。问这个问题是因为第一个示例也不会影响应用程序的响应性。

两个示例都独立于UI线程运行,这就是为什么两个示例都不会影响响应性

那么行为上的区别是什么呢

在第二个示例中,您创建的线程将在
GetData
完成之前终止。当
GetData
完成时,您的代码将在从线程池中获取的不同线程上继续

两者都是“合乎逻辑的”,但是否更好取决于您的使用要求

终止线程,然后使用线程池意味着线程数可能会保持较低,因此应用程序将使用较少的资源

但是,如果应用程序已经使用了最大数量的线程池线程,那么在等待线程池线程可用时,可能需要等待处理返回的数据


这只在可伸缩性是个问题并且您正在使用尽可能多的机器资源的情况下才重要。在大多数情况下,这根本不会造成明显的差异。

您的两个示例都独立于UI线程运行,这就是为什么两个示例都不会影响响应性

那么行为上的区别是什么呢

在第二个示例中,您创建的线程将在
GetData
完成之前终止。当
GetData
完成时,您的代码将在从线程池中获取的不同线程上继续

两者都是“合乎逻辑的”,但是否更好取决于您的使用要求

终止线程,然后使用线程池意味着线程数可能会保持较低,因此应用程序将使用较少的资源

但是,如果应用程序已经使用了最大数量的线程池线程,那么在等待线程池线程可用时,可能需要等待处理返回的数据


这只在可伸缩性是个问题并且您正在使用尽可能多的机器资源的情况下才重要。在大多数情况下,这根本不会产生明显的区别。

因此,如果我没有弄错的话,第二个选项对CPU更友好,对吗?@James-我怀疑没有。第二个选项对资源更友好,但对CPU不友好。将所有内容捆绑起来,然后稍后将其分配到池线程,这需要CPU周期。但是我们谈论的是少量。所以如果我没弄错的话,第二个选项对CPU更友好,是吗?@James-我想不是。第二个选项对资源更友好,但对CPU不友好。将所有内容捆绑起来,然后稍后将其分配到池线程,这需要CPU周期。但我们谈论的是少量。最好的解决方案是使用
Task
而不是
Thread
Task worker=Task.Run(async()=>…)@StephenCleary:为什么是Stephan,就什么任务更好而言。如果你没有;我不介意,请解释一下。(我渴望得到信息)检索结果和异常更容易。完整描述。@StephenCleary:非常感谢Stephan,我在这里还有一个关于套接字的问题“”,在你的博客中我还找到了TCP/IP常见问题解答部分,我想你也可以在这个问题上帮助我,如果你能帮助我,我真的很感激。对不起,我不知道代理隧道。最好的解决方案是使用
Task
而不是
Thread
Task worker=Task.Run(async()=>…)@StephenCleary:为什么是Stephan,就什么任务更好而言。如果你没有;我不介意,请解释一下。(我渴望得到信息)检索结果和异常更容易。完整描述。@StephenCleary:非常感谢Stephan,我在这里有另一个关于套接字的问题“”,在你的博客中,我还找到了TCP/IP常见问题解答部分,我想你也可以在这个问题上帮助我,如果你能帮我,我真的很感激。对不起,我不知道代理隧道。