线程的异步委托

时间:2015-03-01 22:04:25

标签: c# multithreading asynchronous

使用线程时,使用异步委托是否合乎逻辑?例如,假设我们有一个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());
});

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

1 个答案:

答案 0 :(得分:3)

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

那么行为的区别是什么?

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

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

终止你的线程然后利用线程池意味着你的线程数可能会保持较低,所以你的应用程序将使用更少的资源。

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

只有在可扩展性成为问题并且您正在使用最大数量的机器资源的情况下,这才有意义。在大多数情况下,这根本就没有明显的区别。