c# - 多线程导致竞争条件
问题描述
这是我的片段
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
实例(例如,注入 aConnectorFactory
而不是 a Connector
)。
推荐阅读
- flutter - Flutter 中的 SelectableText.rich
- qt - 即使使用垂直滚动条,如何在表格中放置列
- flutter - 结束标签下的红线颤动
- python-3.x - 如何按特定值对字典中获得的列表进行排序
- python - 如何从限制同时下载的 url 批量下载图像 (70k)?
- html - 两个图像之间的中心按钮,垂直百分比
- c# - 在运行时重新绑定服务
- maven - com.sun.proxy.$Proxy16 执行时出错
- wpf - 带有 CheckBox 的 WPF DataGrid 标头检查了 DataGrid 中的所有 CheckBox
- scala - Spark:Split 不是 org.apache.spark.sql.Row 的成员