相关疑难解决方法(0)

如何使用异步调用的结果来水合词典?

假设我的代码如下所示:

public async Task<string> DoSomethingReturnString(int n) { ... }
int[] numbers = new int[] { 1, 2 , 3};
Run Code Online (Sandbox Code Playgroud)

假设我想创建一个字典,其中包含调用DoSomethingReturnString与此类似的每个数字的结果:

Dictionary<int, string> dictionary = numbers.ToDictionary(n => n,
    n => DoSomethingReturnString(n));
Run Code Online (Sandbox Code Playgroud)

这是行不通的,因为DoSomethingReturnString返回Task<string>而不是string.intellisense建议我尝试将我的lambda表达式指定为异步,但这似乎也没有解决问题.

c# async-await

15
推荐指数
4
解决办法
6480
查看次数

将任务字典转换为结果字典

我有一个程序,必须处理多个对象并进行分析。每个分析都会产生一个字符串,并将这些字符串连接起来以创建一个报告。报告需要按一定顺序排列结果,但我想异步分析每个项目,因此我将所有内容放入字典中进行管理,然后可以在准备最终输出之前对其进行排序。

注意:在本例中,我将假装我们正在分析当前程序集中的类型,尽管在我看来,它比这要复杂得多。

(我认为)执行此操作的基本模式如下:

var types = myAssembly.GetTypes();
var tasks = types.ToDictionary( key => key, value => AnalyzeType(value) );
//AnalyzeType() is an async method that returns Task<string>.
Run Code Online (Sandbox Code Playgroud)

现在我们有了一个热门任务字典,由于我什么都没等,所以在创建字典时可能会完成也可能不会完成。

现在获取结果。我该怎么做?

等待

从理论上讲,我要做的就是等待每个任务。等待操作的结果是值本身。但这并不能转换任何东西。

var results = tasks.ToDictionary( k => k.key, async v => await v.Value );
Console.WriteLine(results.GetType().FullName);
Run Code Online (Sandbox Code Playgroud)

输出:

System.Collections.Generic.Dictionary'2[[System.Type, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Threading.Tasks.Task'1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]

我感到困惑……我想通过将awaitTask 放在前面,C#会将其转换为结果。但是我还有任务字典。

GetResult()

另一种方法是使用此方法:

var results = tasks.ToDictionary( key => key, value => value.GetAwaiter().GetResult() );
Console.WriteLine(results.GetType().FullName);
Run Code Online (Sandbox Code Playgroud)

输出:

System.Collections.Generic.Dictionary'2[[System.Type, mscorlib, Version=4.0.0.0, …

.net c# asynchronous task

4
推荐指数
1
解决办法
1524
查看次数

标签 统计

c# ×2

.net ×1

async-await ×1

asynchronous ×1

task ×1