对象被另一个线程更改

问题描述

| 在许多系统需要访问同一方法的复杂系统的一部分中会遇到此问题。这个项目是用C#编写的。为了简化问题,我使用下图: 我有两个自定义的类,这两个类的父类是相同的。苹果和橙这两个类别,父类是水果。当我期望有一个苹果时,问题就来了,但实际上是一个橙色。有时(并非罕见)会发生这种情况,大概有10%的时间。
public void MethodAlpha(object food)
{
   lock(this)
   {
       Foodobj foodobj = Converter.XMLStringToObject(food,...) //\"food\" is a string

       if(foodobj.FoodType == StringConstants.Apple)
       {
           Apple apple = (Apple)foodobj.Foodobject; <--InvaildCastException
           ...
       }
       ...
   }
}
InvaildCastException表示我已经通过\“ lock(this)\”和if检查来处理橘子时,尝试将橘子浇铸到苹果上。我处理不正确吗?我应该如何解决这个问题?     

解决方法

        您说
food
string
;现在,ѭ2是不可变的,因此在方法期间未更改-参数and1ѭ不是by-ref(
ref
),因此在方法期间未更改。 出现“ 6”(很难说)来将字符串解析为一个对象,因此那里没有共享状态,除非您有一些尚未告诉我们的缓存。 所以...这只是代码中的解析错误;与线程无关。 注意:方法参数和变量是按调用进行的-它们是隔离的(除非它们引用共享状态)。 这不是线程问题。只是一个普通的错误。在解析过程中的某个时候,您将其称为苹果,但是将其分配为橙色。遍历
XMLStringToObject
找到它,特别是查看assigned8ѭ和
FoodObject
被分配的位置。 顺便说一句,“ 10”通常不是一个好主意。在这种情况下,它也没有任何用处,因为您没有要保护的共享状态。如果有用途,则最好为此使用一个专用对象:
private readonly object syncLock = new object();
...
lock(syncLock) {...}
    ,        正如Marc Gravell建议的那样,使用单独的Object实例进行锁定并摆脱异常
Apple apple = foodObj.FoodObject as Apple;

if(apple != null)
{
 // do something here
}