相关疑难解决方法(0)

Parallel.ForEach和async-await

我有这样的方法:

public async Task<MyResult> GetResult()
{
    MyResult result = new MyResult();

    foreach(var method in Methods)
    {
        string json = await Process(method);

        result.Prop1 = PopulateProp1(json);
        result.Prop2 = PopulateProp2(json);

    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

然后我决定使用Parallel.ForEach:

public async Task<MyResult> GetResult()
{
    MyResult result = new MyResult();

    Parallel.ForEach(Methods, async method =>
    {
        string json = await Process(method);    

        result.Prop1 = PopulateProp1(json);
        result.Prop2 = PopulateProp2(json);
    });

    return result;
}
Run Code Online (Sandbox Code Playgroud)

但现在我有一个错误:

在异步操作仍处于挂起状态时完成异步模块或处理程序.

c# task-parallel-library async-await parallel.foreach

37
推荐指数
4
解决办法
4万
查看次数

将异步方法传递到 Parallel.ForEach

我正在阅读这篇关于Parallel.ForEach“Parallel.ForEach 与传入异步方法不兼容”的文章。

所以,为了检查我写了这段代码:

static async Task Main(string[] args)
{
    var results = new ConcurrentDictionary<string, int>();

    Parallel.ForEach(Enumerable.Range(0, 100), async index =>
    {
        var res = await DoAsyncJob(index);
        results.TryAdd(index.ToString(), res);
    });         

    Console.ReadLine();
}

static async Task<int> DoAsyncJob(int i)
{
    Thread.Sleep(100);
    return await Task.FromResult(i * 10);
}
Run Code Online (Sandbox Code Playgroud)

此代码同时填充results字典。

顺便说一下,我创建了一个类型的字典,ConcurrentDictionary<string, int>因为万一我ConcurrentDictionary<int, int>在调试模式下探索它的元素时,我看到元素是按键排序的,我认为因此添加了 elenents。

所以,我想知道我的代码是否有效?如果它“与传入异步方法不兼容”,为什么它运行良好?

c# async-await parallel.foreach

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