如何在C#中避免异步编程中的显式锁定?

时间:2016-04-06 07:51:51

标签: c# asynchronous collections thread-safety locking

我正在开发一个用 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());
                }
            }
        }

1 个答案:

答案 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