在C#中,当多个线程同时访问和修改同一个对象时,可能会引发并发修改异常(ConcurrentModificationException)。为了避免这种情况,可以使用以下策略:
private readonly object _lock = new object();
public void AddItem(string item)
{
lock (_lock)
{
// 添加项的逻辑
}
}
ConcurrentQueue
、ConcurrentDictionary
等。这些数据结构内部已经实现了并发控制,因此可以避免并发修改异常。private readonly ConcurrentQueue<string> _queue = new ConcurrentQueue<string>();
public void AddItem(string item)
{
_queue.Enqueue(item);
}
private int _counter = 0;
public void Increment()
{
Interlocked.Increment(ref _counter);
}
lock
和Monitor.TryEnter
的组合:在某些情况下,可以使用lock
和Monitor.TryEnter
的组合来避免死锁和提高性能。Monitor.TryEnter
允许在尝试获取锁时不阻塞,如果成功则执行代码块,否则不执行任何操作。private readonly object _lock = new object();
public void AddItem(string item)
{
if (Monitor.TryEnter(_lock))
{
try
{
// 添加项的逻辑
}
finally
{
Monitor.Exit(_lock);
}
}
}
SemaphoreSlim
或Monitor
类:这些类提供了更灵活的锁定机制,可以用于控制对共享资源的访问。例如,SemaphoreSlim
允许你限制同时访问资源的线程数量。private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1);
public void AddItem(string item)
{
_semaphore.Wait();
try
{
// 添加项的逻辑
}
finally
{
_semaphore.Release();
}
}
总之,处理并发修改异常的关键是确保在同一时间只有一个线程能够访问和修改共享资源。可以使用锁、线程安全的数据结构、原子操作、lock
和Monitor.TryEnter
的组合以及SemaphoreSlim
或Monitor
类来实现这一目标。在实际应用中,需要根据具体场景选择合适的策略。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。