Я пытаюсь контролировать доступ к буферу 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;
}
}
}
«семафор никогда не уменьшает счетчик» Чтение счетчика внутри семафора не является хорошим способом, чтобы увидеть, если он работает. Попробуйте правильно объяснить свою проблему. – Euphoric
Вместо использования поля '_data', я думаю, что лучший способ - использовать лямбда. Например. 'new Thread (() => Set (data))'. – svick
Семафор ничего не защищает, он не нужен. –