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所追求的。