首页 > 解决方案 > 多线程导致竞争条件

问题描述

这是我的片段

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被其中一个线程覆盖。最终,我有很多重复的电话。

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

标签: c#multithreadingrace-condition

解决方案


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


推荐阅读