📜  如何在C#中获得对队列的同步访问

📅  最后修改于: 2021-05-29 19:28:25             🧑  作者: Mango

Queue.SyncRoot属性用于获取一个对象,该对象可用于同步对Queue的访问。队列代表对象的先进先出集合。当您需要对项目进行先进先出的访问时,可以使用它。当您在列表中添加项目时,它称为入队,而当您删除项目时,它称为出队。此类位于System.Collections命名空间下,并实现ICollection,IEnumerable和ICloneable接口。

重要事项:

  • 完成对象的同步,以便只有一个线程可以操纵队列中的数据。
  • 属性是提供读取,写入和计算私有数据字段的手段的类的成员。
  • 同步代码不能直接在集合上执行,因此它必须在集合的SyncRoot上执行操作,以保证从其他对象派生的集合的正确操作。
  • 检索此属性的值是O(1)操作。

示例1:在此代码中,我们使用SyncRoot获取对名为q1的Queue的同步访问,这不是线程安全的过程,并且可能导致异常。因此,为避免异常,我们在枚举期间锁定了集合。

// C# program to illustrate the
// use of SyncRoot property of
// the Queue
using System;
using System.Threading;
using System.Collections;
  
namespace sync_root {
  
class GFG {
  
    // Main Method
    static void Main(string[] args)
    {
  
        // Declaring an Queue
        Queue q1 = new Queue();
  
        // Adding elements to Queue
        q1.Enqueue(1);
        q1.Enqueue(2);
        q1.Enqueue(3);
        q1.Enqueue(4);
        q1.Enqueue(5);
  
        // Using the SyncRoot property
        lock(q1.SyncRoot)
        {
            // foreach loop to display
            // the elements in q1
            foreach(Object i in q1)
                Console.WriteLine(i);
        }
    }
}
}
输出:
1
2
3
4
5

范例2:

// C# program to illustrate the
// use of SyncRoot property of
// the Queue
using System;
using System.Threading;
using System.Collections;
  
namespace sync_root {
  
class GFG {
  
    // Main Method
    static void Main(string[] args)
    {
  
        // Declaring an Queue
        Queue q1 = new Queue();
  
        // Adding elements to Queue
        q1.Enqueue("C");
        q1.Enqueue("C++");
        q1.Enqueue("Java");
        q1.Enqueue("C#");
        q1.Enqueue("HTML");
  
        // Using the SyncRoot property
        lock(q1.SyncRoot)
        {
            // foreach loop to display
            // the elements in q1
            foreach(Object i in q1)
                Console.WriteLine(i);
        }
    }
}
}
输出:
C
C++
Java
C#
HTML

参考:

  • https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.queue.syncroot?view=netframework-4.7.2#System_Collections_Queue_SyncRoot