Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.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# 如果条件不满足';不能在多线程中工作_C#_Multithreading - Fatal编程技术网

C# 如果条件不满足';不能在多线程中工作

C# 如果条件不满足';不能在多线程中工作,c#,multithreading,C#,Multithreading,我编写了这个管理器类,它保存所有加载的位图。 我不想将同一位图存储两次,因此我检查是否已经有一个具有相同持久性名称的BitmapHolder(toString()对象方法) 问题是,即使不应该,签入Add()也会被忽略(或者看起来是这样)。最后,这个类在列表中包含几个相同的对象 public class LazyStatic<T> where T : new() { protected static T _static; public static T Static

我编写了这个管理器类,它保存所有加载的位图。 我不想将同一位图存储两次,因此我检查是否已经有一个具有相同持久性名称的
BitmapHolder
toString()
对象方法)

问题是,即使不应该,签入
Add()
也会被忽略(或者看起来是这样)。最后,这个类在列表中包含几个相同的对象

public class LazyStatic<T> where T : new()
{
    protected static T _static;
    public static T Static
    {
        get
        {
            if (_static == null) _static = new T();
            return _static;
        }
    }
}

public class BitmapManager : LazyStatic<BitmapManager>
{
   private List<BitmapHolder> _bitmaps;

   public BitmapManager()
   {
       _bitmaps = new List<BitmapHolder>();
   }

   /// <summary>
   /// Will add a loaded bitmap to the internal list.
   /// </summary>
   public void Add(Bitmap b, string persistenceName)
   {
       lock (_bitmaps)
       {
           if (GetBitmap(persistenceName) != null)
               return;
           BitmapHolder bh = new BitmapHolder
           {
               Bitmap = b,
               PersistenceName = persistenceName
           };
           _bitmaps.Add(bh);
       }
   }

   /// <summary>
   /// Will run through the internal list and look for a bitmap
   /// with the matching persistence name. Will return target if
   /// exists, otherwise null.
   /// </summary>
   public Bitmap GetBitmap(string persistenceName)
   {
       lock (_bitmaps)
       {
           foreach (BitmapHolder bhs in _bitmaps)
           {
               if (bhs.PersistenceName.Equals(persistenceName))
                   return bhs.Bitmap;
           }
           return null;
       }
   }
公共类lazystic,其中T:new()
{
保护静电T_静电;
公共静态
{
得到
{
如果(_static==null)_static=new T();
返回静态;
}
}
}
公共类位图管理器:LazyStatic
{
私有列表\u位图;
公共位图管理器()
{
_位图=新列表();
}
/// 
///将向内部列表中添加加载的位图。
/// 
公共void添加(位图b,字符串persistenceName)
{
锁定(_位图)
{
if(GetBitmap(persistenceName)!=null)
返回;
BitmapHolder bh=新的BitmapHolder
{
位图=b,
PersistenceName=PersistenceName
};
_位图。添加(bh);
}
}
/// 
///将运行内部列表并查找位图
///具有匹配的持久性名称。如果
///存在,否则为空。
/// 
公共位图GetBitmap(字符串persistenceName)
{
锁定(_位图)
{
foreach(位图中的位图持有者bhs)
{
if(bhs.PersistenceName.Equals(PersistenceName))
返回行李处理系统位图;
}
返回null;
}
}

我的问题是。如何防止该方法“忽略”if条件。

编写异步代码时必须记住的一点是,全局对象可以在进程中间由另一个线程更改。在多线程操作期间始终实例化本地对象。传入全局使用的对象引用将产生unstable结果。

静态
的getter上存在一个潜在的争用条件,该争用条件不受锁的保护。争用条件可能导致创建
\u Static
成员的重复实例,并且每个实例都将包含一个同名位图。如果使用defa实例化静态成员,则可以避免这种情况ult:

public static class LazyStatic<T> where T : new()
{
    private static T _static = new T();

    public static T Static
    {
       get
       {
          return _static;
       }
    }
}
公共静态类lazystic,其中T:new()
{
私有静态T_static=new T();
公共静态
{
得到
{
返回静态;
}
}
}
如果要进一步推迟实例化,请执行以下操作:

 public static class LazyStatic<T> where T : new()
{
    private static T _static = new Lazy<T>();

    public static T Static
    {
       get
       {
          return _static.Value;
       }
    }
}
公共静态类lazystic,其中T:new()
{
私有静态T_static=new Lazy();
公共静态
{
得到
{
返回_static.Value;
}
}
}

你的问题是什么?使用锁。你需要使用.NET提供的同步功能之一,例如。线程同步是一个广泛的主题。你可以开始。看到了吗?你能展示一个persistenceName的示例吗?你确定它是一致的吗?再看看这个:OP不会理解你正在体验的级别在实现多线程用户界面系统之前,某些基本的编程概念应该得到普遍的理解。这个懒散的类看起来像是对单例设计模式的尝试。我认为单例可能实际上就是OP所追求的。