gpt4 book ai didi

c# - 线程的异步委托(delegate)

转载 作者:太空宇宙 更新时间:2023-11-03 23:41:48 24 4
gpt4 key购买 nike

使用线程时,使用异步委托(delegate)合乎逻辑吗?例如,假设我们有一个 WCF SOAP 服务,并且我们有一个使用 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 完成时,您的代码将在取自线程池的另一个线程上继续。

两者都是“合乎逻辑”的,但哪个更好或哪个更好取决于您的使用需求。

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

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

这仅在可扩展性成为问题并且您正在使用最大数量的机器资源的情况下才有意义。在大多数情况下,这根本不会产生明显的差异。

关于c# - 线程的异步委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28799694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com