【发布时间】:2020-07-26 17:58:25
【问题描述】:
我在我的代码中使用了一个后台工作程序,它在完成工作后调用多个函数。
在这些函数中,有一些私有变量也被后台工作人员使用(尽管它们是在工作完成后访问的)。
例如,
private void Work_Completed(object sender, RunWorkerCompletedEventArgs e)
{
Handle_OnProgressBarCompleted();
ParseDataFromXml();
AddTabsWithDataGridViewToTabControl();
}
在大多数这些函数中,都有一个锁来保护私有变量不被另一个线程访问。例如,在 ParseDataFromXml()
private void ParseDataFromXml()
{
lock (_lock)
{
RiskLimitsConfigColl = _riskLimitXmlReader.GetRiskLimitsConfigurations(_filePath);
var riskLimitValidationData = new RiskLimitValidationData(RiskLimitsConfigColl);
Dataset = riskLimitValidationData.GetData();
RiskLimitsConfigColl = riskLimitValidationData.GetRiskLimits();
CommonConfigurations();
}
}
我用来保护我的私有变量的锁的数量正在变得不守规矩,我觉得我在我的代码周围喷洒锁而不知道它们应该在哪里(每个私有变量都在一个 lock 语句中)。
我的问题是:在 lock 语句中包含另一个函数调用是不好的做法吗?如果ParseDataFromXML 中的CommonConfigurations 里面有一个lock 语句,我会死锁吗?使用锁定语句时,我最好的前进道路应该是什么?
我读到here那个
排他锁用于确保一次只有一个线程可以进入特定的代码段。
所以我假设我需要查找两个线程都引用的函数并在那里使用锁。
【问题讨论】:
标签: c# multithreading locking backgroundworker