如何实现一个全局信号量类

本文关键字:一个 全局 信号量 实现 何实现 | 更新日期: 2023-09-27 18:15:33

我试图通过使用信号量来控制对windows剪贴板的访问。我需要这个信号量在整个应用程序中是全局的,因为几个线程访问信号量以将数据保存到窗口剪贴板。我面临的问题是信号量永远不会减少计数器。无论有多少线程访问该信号量,它总是1。

namespace Global.GlobalLocks
{
    static public class Clipboard
    {
        static public readonly SemaphoreSlim ClipboardSemaphore = new SemaphoreSlim(1);
    }
}
下面是我如何使用上面的代码:
namespace Automator.Global
{
    static public class ClipBoard
    {
        static private string _data = string.Empty;
        static public void SetData(string data)
        {
            GlobalLocks.Clipboard.ClipboardSemaphore.Wait();
            _data = data;
            Thread t = new Thread(Set);
            t.SetApartmentState(ApartmentState.STA);
            t.Start();
            GlobalLocks.Clipboard.ClipboardSemaphore.Release(); 
        }
        static private void Set()
        {
            Clipboard.Clear();
            Clipboard.SetDataObject(_data, true);
        }
        static public string GetData()
        {
            return _data;
        }
    } 
}

如何实现一个全局信号量类

在启动线程Set后立即释放信号量。当它执行时,信号量可以是1或0。将发布代码移动到Set

static public void SetData(string data)
{
    GlobalLocks.Clipboard.ClipboardSemaphore.Wait();
    _data = data;
    Thread t = new Thread(Set);
    t.SetApartmentState(ApartmentState.STA);
    t.Start();
}
static private void Set()
{
     Clipboard.Clear();
     Clipboard.SetDataObject(_data, true);
     GlobalLocks.Clipboard.ClipboardSemaphore.Release(); 
}