我正在开发一个用 C#编写的项目,其中有几个集合可以被不同的线程/任务访问和修改,因此我使用了 lock 关键字(非常多)。我按照提到的here注释和在线提供的其他参考/教程来正确使用此关键字。在考试中,我被问到如何避免这些明确的锁定。在此先感谢,我希望这个问题适合在这里提出。
这是一些代码示例(还有其他循环和方法调用,我删除它们以获得更短的样本):
try
{
lock (this)
{
if (!IsReplaying)
{
//removing igonored tracks from bufferlist
for (int i = 0; i < BufferList.Count; i++)
{
for (int j = 0; j < ListOfIgnoredTracks.Count; j++)
{
CAT62Data dataitem = BufferList[i];
if (BufferList[i].CAT62DataItems[10].value != null)
{
if (BufferList[i].CAT62DataItems[10] != null && BufferList[i].CAT62DataItems[10].value != null)
{
if (dataitem.CAT62DataItems[10].value.ToString() == ListOfIgnoredTracks[j].CAT62DataItems[10].value.ToString() && !dataitem.IsModified && !dataitem.IsUserAdded)
{
BufferList.RemoveAt(i--);
}
}
}
}
}
BufferList.Clear();
RemoveLostTracks(new DateTime());
}
}
}
答案 0 :(得分:1)
其中一个答案是,您可以使用此命名空间代替标准集合。
function getId($fileName){
$con = connect();
if (!$con) {
trigger_error(mysqli_error($con), E_USER_ERROR);
die('Could not connect: ' . mysqli_error($con));
}
$yModuleId = 0;
$sql_filename = mysqli_real_escape_string($con, $fileName);
$query_module_id = "SELECT id FROM y_module WHERE fileName='" . $sql_filename . "'";
$result_module_id = mysqli_query($con, $query_module_id);
while($row_model = mysqli_fetch_array($result_module_id)){
$yModuleId = $row_model['id'];
return $yModuleId;
}
}
function getYPackageId($package_name){
$con = connect();
if (!$con) {
trigger_error(mysqli_error($con), E_USER_ERROR);
die('Could not connect: ' . mysqli_error($con));
}
$sql_packageName = mysqli_real_escape_string($con, $package_name);
$query_package_id = "SELECT id FROM y_package WHERE name='" . $package_name . "'";
$result_package_id = mysqli_query($con, $query_package_id) or die("__LINE__ : " . mysqli_error($con));
while($row_package = mysqli_fetch_array($result_package_id)){
$yPackageId = $row_package['id'];
print_r($yPackageId);
print_r("</br>");
print_r("</br>");
return $yPackageId;
};
}
if($result_model && $result_package && $result_model_package) {
$yModuleId = getId($fileName);
$yPackageId = getYPackageId($package_name);
$yIdObject = new YIds($yModuleId, $yaPackageId);
$yIdObjects [] = $yIdObject;
mysqli_query($con, "COMMIT");
$message = array("success", "[SUCCESS]", "Model published successfully.",$module_id);
}
在这里您可以找到相同的集合,线程安全。 所以你不再需要写 lock 。