我一直在阅读有关syncroot元素但我无法在List类型中找到它.那么应该如何使用System.Collections.Generic.List <>类型完成多线程同步?
Win*_*ith 11
为什么要锁定List<T>而不是列表的特定实例?
通常建议锁定的最佳方法是锁定仅为此目的而创建的私有对象.
private readonly object myListLock = new object();
// Everywhere you access myList
lock(myListLock)
{
// do stuff with myList
}
Run Code Online (Sandbox Code Playgroud)
有关C#中线程的精彩指南,请参阅Joe Albahari撰写的这本免费电子书(C#中的线程).
您必须将通用列表转换为ICollection如下所示:
using System.Collection; // required for ICollection
using System.Collection.Generic;
List<int> myIntList = new List<int>();
lock (((ICollection)myIntList).SyncRoot)
{
// do your synchronized stuff here...
}
Run Code Online (Sandbox Code Playgroud)
请记住,这只会同步访问通用列表的元素.它并没有同步访问泛型列表变量,例如myIntList.如果myIntList在某个时候用新列表替换,则使用SyncRoot是不够的.在这种情况下,我建议创建一个可用于两种同步方案的特定同步对象.
| 归档时间: |
|
| 查看次数: |
13513 次 |
| 最近记录: |