我正在尝试使用信号量控制对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;
}
}
}
_data
字段,我认为更好的方法是使用lambda表达式。例如:new Thread(() => Set(data))
。 - svick