Tag: 锁定

LockBits图像旋转方法不起作用?

大家好。 在厌倦了Get / Set Pixel和RotateTransfom的缓慢性能和古怪行为之后,我使用LockBits进行2D位图图像旋转。 所以这是我提出的代码,通过我的计算,它应该完美地工作。 它没有。 private static void InternalRotateImage(Bitmap originalBitmap, Bitmap rotatedBitmap, PointF centerPoint, float theta) { BitmapData originalData = originalBitmap.LockBits( new Rectangle(0, 0, originalBitmap.Width, originalBitmap.Height), ImageLockMode.ReadOnly, originalBitmap.PixelFormat); BitmapData rotatedData = rotatedBitmap.LockBits( new Rectangle(0, 0, rotatedBitmap.Width, rotatedBitmap.Height), ImageLockMode.WriteOnly, rotatedBitmap.PixelFormat); unsafe { byte[,] A = new byte[originalData.Height * 2, originalBitmap.Width * 2]; byte[,] R […]

ReaderWriterLockSlim和async \ await

我有一些ReaderWriterLockSlim问题。 我无法理解它是如何工作的。 我的代码: private async Task LoadIndex() { if (!File.Exists(FileName + “.index.txt”)) { return; } _indexLock.EnterWriteLock();// _index.Clear(); using (TextReader index = File.OpenText(FileName + “.index.txt”)) { string s; while (null != (s = await index.ReadLineAsync())) { var ss = s.Split(‘:’); _index.Add(ss[0], Convert.ToInt64(ss[1])); } } _indexLock.ExitWriteLock(); } 当我在输入写锁定时,在调试器中我可以看到_indexLock.IsWriteLockHeld为true ,但是当执行步骤为时,我看到_indexLock.IsWriteLockHeld为false而_indexLock.ExitWriteLock抛出exceptionSynchronizationLockException并显示消息“The write锁被释放而没有被举行“。 我做错了什么?

yield语句中的yield返回

如果我在一个锁定语句中有一个收益率回报,锁定会在每个收益率上取消(在下面的例子中为5次),或者只对列表中的所有项目取消一次? 谢谢 private List _data = new List(){“1″,”2″,”3″,”4″,”5”}; private object _locker =new object(); public IEnumerable GetData() { lock (_locker) { foreach (string s in _data) { yield return s; } } }

如何执行行锁?

我想锁定一条记录,然后没有人可以对该记录进行更改。 当我释放锁定时,人们可能会更改记录。 在锁定记录的同时,我想向用户显示记录已被锁定且不允许更改的警告。 我怎样才能做到这一点? 我已经尝试了所有的IsolationLevel级别,但它们都没有我想要的行为。 一些隔离级别会等到锁定释放后再进行更改。 我不希望这样,因为在锁定记录时不允许更新。 如何锁定记录并拒绝所有更改? 我使用SQL Server 2008

C#如何检测对象已被锁定

如何检测对象是否被锁定? Monitor.TryEnter (如有没有办法检测对象是否被锁定? )对我不起作用,因为它锁定了对象(如果没有锁定)。 我只想检查它是否被锁定以及我的代码中的其他地方我将使用Monitor类来锁定对象。 我知道可以使用例如布尔字段(例如private bool ObjectIsLocked ),但是使用lock-object本身检测它。 下面的示例代码显示了我想要做的事情: private static object myLockObject = new object(); private void SampleMethod() { if(myLockObject /*is not locked*/) // First check without locking it { … // The object will be locked some later in the code if(!Monitor.TryEnter(myLockObject)) return; try { …. } catch(){…} finally { Monitor.Exit(myLockObject); } […]

锁定与ToArray的线程安全foreach访问List集合

我有一个List集合,我想在multithreading应用程序中迭代它。 我需要在每次迭代时保护它,因为它可以被更改,而且当我做foreach时我不想要“收集被修改”的exception。 这样做的正确方法是什么? 每次访问或循环时都使用锁定。 我对死锁感到十分害怕。 也许我只是偏执使用锁而不应该。 如果我走这条路以避免死锁,我需要知道什么? 锁是否相当有效? 每次我做foreach时,使用List 。ToArray()复制到数组。 这会导致性能下降,但很容易做到。 我担心内存颠簸以及复制它的时间。 看起来过分了。 使用ToArray是否安全? 不要使用foreach而是使用for循环。 每次我这样做以确保列表没有收缩时,我不需要进行长度检查吗? 这看起来很烦人。

如何在C#中锁定整数?

有没有办法在C#中锁定一个整数? 整数不能与锁一起使用,因为它们是盒装的(并且只锁定引用上的锁)。 场景如下:我有一个基于论坛的网站,具有审核function。 我想要做的是确保在任何给定时间只有一个主持人可以调节post。 为此,我想锁定post的ID。 到目前为止我有几个想法(例如使用字典),但我正在寻找一种更好,更清洁的方法。 有什么建议?

ReaderWriterLockSlim与Monitor

我有一个IDictionary实现,它在内部保存另一个Dictionary并通过密钥的HashCode将这些插入分发到invidual子词典。 有16个子词典,4核机器上的冲突数量非常少。 对于并行插入,我使用ReaderWriterLockSlim锁定Add方法,仅锁定单个子字典: public void Add(TKey key, TValue value) { int poolIndex = GetPoolIndex(key); this.locks[poolIndex].EnterWriteLock(); try { this.pools[poolIndex].Add(key, value); } finally { this.locks[poolIndex].ExitWriteLock(); } } 当插入具有四个线程的项目时,我只有大约32%的CPU使用率和糟糕的性能。 所以我用Monitor替换了ReaderWriterLockSlim(即lock关键字)。 CPU使用率目前接近100%,性能提高了一倍多。 我的问题是:为什么CPU使用率会增加? 碰撞次数不应该改变。 是什么让ReaderWriterLock.EnterWriteLock等了这么多次?

c#xml.Load()锁定磁盘上的文件导致错误

我有一个简单的类XmlFileHelper如下: public class XmlFileHelper { #region Private Members private XmlDocument xmlDoc = new XmlDocument(); private string xmlFilePath; #endregion #region Constructor public XmlFileHelper(string xmlFilePath) { this.xmlFilePath = xmlFilePath; xmlDoc.Load(xmlFilePath); } #endregion #region Public Methods public XmlNode SelectSingleNode(string xPathQuery) { return xmlDoc.SelectSingleNode(xPathQuery); } public string GetAttributeValueByName(XmlNode node, string attributeName) { return node.Attributes.GetNamedItem(attributeName).Value; } #endregion #region Public Properties […]

线程安全的memoization

让我们以Wes Dyer的函数memoization方法为出发点: public static Func Memoize(this Func f) { var map = new Dictionary(); return a => { R value; if (map.TryGetValue(a, out value)) return value; value = f(a); map.Add(a, value); return value; }; } 问题是,当从多个线程使用它时,我们可能遇到麻烦: Func f = … var f1 = f.Memoize(); … in thread 1: var y1 = f1(1); in thread 2: […]