C#中如何将Task<SearchResult<ProviderShortInfoDTO>>转为SearchResult<ProviderShortInfoDTO>
将Task<SearchResult>转换为SearchResult的可行方法
以下是几种在C#中实现该类型转换的有效方式:
1. 使用await关键字(异步场景推荐)
这是处理Task<T>类型最安全、常规的方式,需在异步方法(标记为async)中使用,它会等待任务完成并返回最终结果,同时不会阻塞当前线程。
结合你的代码示例,修改后可以这样写:
Dictionary<TenantDTO, Task<SearchResult<ProviderShortInfoDTO>>> tasks = providerIds.ToDictionary(x => x.Key, y => _providerManagementService.GetProviderAccounts(y.Key, GetQueryByProviders(y.Value))); // 等待所有任务完成,得到结果数组 SearchResult<ProviderShortInfoDTO>[] providerShortInfos = await Task.WhenAll(tasks.Select(x => x.Value)); // 如果要单独处理单个Task<T>结果 foreach (var task in tasks.Values) { SearchResult<ProviderShortInfoDTO> result = await task; // 处理result逻辑 }
2. 使用Task.Result属性(同步场景谨慎使用)
如果是在同步代码中,可以直接访问Result属性获取任务结果,但要注意:该属性会阻塞当前线程直到任务完成,在UI线程、ASP.NET(非Core)等场景中可能引发死锁问题,仅建议在控制台程序等无上下文的同步环境使用。
示例代码:
foreach (var task in tasks.Values) { SearchResult<ProviderShortInfoDTO> result = task.Result; // 处理result逻辑 }
3. 使用Task.GetAwaiter().GetResult()
和Result类似,同样会阻塞线程等待任务完成,但区别在于它会直接抛出任务执行过程中的原始异常,而不是包装在AggregateException中,同样存在死锁风险,使用场景同Result。
示例代码:
foreach (var task in tasks.Values) { SearchResult<ProviderShortInfoDTO> result = task.GetAwaiter().GetResult(); // 处理result逻辑 }
内容的提问来源于stack exchange,提问作者ravipatel
相关产品推荐
相关产品推荐

