导致竞争条件的多线程
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
)。
这是我的片段
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
)。