Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 例如,ableList,它的工作方式类似于列表,但支持的唯一操作是在末尾添加。当需要增加列表时,会创建一个新数组,将旧项复制到其中,列表的数组引用指向新数组,新项写入其中,并且项计数会增加。在add操作期间,AppendableList本身将始终处于一致状_C#_Exception Handling_Synchronization - Fatal编程技术网

C# 例如,ableList,它的工作方式类似于列表,但支持的唯一操作是在末尾添加。当需要增加列表时,会创建一个新数组,将旧项复制到其中,列表的数组引用指向新数组,新项写入其中,并且项计数会增加。在add操作期间,AppendableList本身将始终处于一致状

C# 例如,ableList,它的工作方式类似于列表,但支持的唯一操作是在末尾添加。当需要增加列表时,会创建一个新数组,将旧项复制到其中,列表的数组引用指向新数组,新项写入其中,并且项计数会增加。在add操作期间,AppendableList本身将始终处于一致状,c#,exception-handling,synchronization,C#,Exception Handling,Synchronization,例如,ableList,它的工作方式类似于列表,但支持的唯一操作是在末尾添加。当需要增加列表时,会创建一个新数组,将旧项复制到其中,列表的数组引用指向新数组,新项写入其中,并且项计数会增加。在add操作期间,AppendableList本身将始终处于一致状态,但add不会是线程安全的。如果“添加”操作被挂起,并且允许第二个线程添加到列表中,则数据结构将正常……直到第一个线程尝试完成其操作为止。如果第一个线程部分完成了它的操作,但可以保证永远不会回来完成它,那么让数据结构对其他线程可用就没有问题了


例如,ableList,它的工作方式类似于列表,但支持的唯一操作是在末尾添加。当需要增加列表时,会创建一个新数组,将旧项复制到其中,列表的数组引用指向新数组,新项写入其中,并且项计数会增加。在add操作期间,AppendableList本身将始终处于一致状态,但add不会是线程安全的。如果“添加”操作被挂起,并且允许第二个线程添加到列表中,则数据结构将正常……直到第一个线程尝试完成其操作为止。如果第一个线程部分完成了它的操作,但可以保证永远不会回来完成它,那么让数据结构对其他线程可用就没有问题了。虽然我同意您的观点,即使数据处于无效状态的代码应该在释放锁之前清除数据,或者使用某种方法来表示数据处于无效状态,我认为假设锁中抛出的任何异常都会破坏状态是过于悲观的。@supercat:假设锁中抛出的任何异常都会使事物处于混乱状态不是过于悲观的。你拿了锁这一事实本身就意味着你希望锁能保护某些东西。如果失去这种保护不会破坏任何东西,那么你为什么要使用锁呢?@supercat:我当然同意你的观点,这可以概括为“扔掉读锁不会破坏任何东西”。当然但让我们看看这里的大局。然后,假定的场景正在读取由异常引起的关键部分保护的内容。这听起来是一个很好的处境吗?在这一关键部分中,单独阅读会导致异常,到底是怎么回事???这听起来像是一个需要修复的bug,而不是主线场景。
try  
{  
   lock(syncblk)  
   {  
        // do some processing  
    }  

}  
catch(Exception e)  
{  
    // do something with exception  
}  
System.Threading.Monitor.Enter(x);
try {
   ...
}
catch(Exception e)
{
}
finally {
   System.Threading.Monitor.Exit(x);
}
lock(whatever)
{
    try
    {
        MakeAMess();
    }
    finally
    {
        CleanItUp();
        // Either by completing the operation or rolling it back 
        // to the pre-mess state
    }
}