导致竞争条件的多线程

Multi threading leading to race conditions

这是我的片段

Public async Task DoSomething(List<T> dataList)
{
    foreach (T claim in dataList)
    {
        var claimLineTask = AssembleClaimLines(claim);
        tasks.Add(claimLineTask);
    }
    await Task.WhenAll(tasks);
    return dataList;
}

protected async Task AssembleClaimLines(T claim)
{
    connector.ConfigSettingsSection = "Claims.Lines";
    connector.QueryParameters = new Dictionary<string, string>()
    {
        {“id”, claim.ID.ToString()},
    };
    claim.data = await connector.GetData()            
    return;
}

我在调用 AssembleClaimLines() 时遇到竞争条件。connector.QueryParameters 的值被其中一个线程覆盖。最终,我有很多重复的电话。

一个简单的解决方法是,我可以将 connector 作为 AssembleClaimLines 的参数传递。但我不能这样做,因为 connector 是从依赖注入传入的。我还能如何解决竞争条件并仍然充分利用多线程?

您的 Connector API 需要更改以支持多个并发调用(例如,将 ConfigSettingsSection/QueryParameters 移动到 GetData 上的参数) ,或者您需要获取多个 Connector 实例(例如,注入 ConnectorFactory 而不是 Connector)。