c# - 如何实现全局信号量类

标签 c# semaphore

我正在尝试使用信号量来控制对 Windows 剪贴板的访问。我需要这个信号量在整个应用程序中是全局的,因为多个线程访问信号量以将数据保存到 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。将 realease 代码移动到 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(); 
}

关于c# - 如何实现全局信号量类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16750902/

相关文章:

c - 未命名信号量 POSIX IPC

c - 多个客户端的 posix 共享内存

c - 段错误使用信号量来同步 C 中的 3 个线程

c# - 我对 WCF 缺少什么?

c# - .net 4.0 并发队列字典

c# - 在 Parallel.ForEach 中指定默认的 MaxDegreeOfParallelism?

c# - 使用 iTextSharp 4.1.6 为特定页面添加书签

C - Linux - Pthreads 和信号量

使用 Semaphore 运行时出现 java.util.NoSuchElementException

c# - 外键关系不会出现在带有 mysql 数据库的 edmx 中,带有带有数据库的 asp mvc