线程的异步委托
Async delegate for a Thread
使用线程时,使用异步委托合乎逻辑吗?例如,假设我们有一个 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
完成后,您的代码将在取自线程池的另一个线程上继续。
两者都是'logical',但好与不好就看你的使用需求了
终止你的线程然后使用线程池意味着你的线程数可能会保持较低,因此你的应用程序将使用较少的资源。
但是,如果您的应用程序已经使用了最大数量的线程池线程,那么在您等待线程池线程可用时可能需要等待处理返回的数据。
这仅在可伸缩性成为问题并且您正在使用尽可能多的机器资源的情况下才有意义。在大多数情况下,这根本不会产生明显的差异。
使用线程时,使用异步委托合乎逻辑吗?例如,假设我们有一个 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
完成后,您的代码将在取自线程池的另一个线程上继续。
两者都是'logical',但好与不好就看你的使用需求了
终止你的线程然后使用线程池意味着你的线程数可能会保持较低,因此你的应用程序将使用较少的资源。
但是,如果您的应用程序已经使用了最大数量的线程池线程,那么在您等待线程池线程可用时可能需要等待处理返回的数据。
这仅在可伸缩性成为问题并且您正在使用尽可能多的机器资源的情况下才有意义。在大多数情况下,这根本不会产生明显的差异。