我正在尝试使用信号量来控制对 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/