2013-05-25 217 views
2

我想通过使用信号来控制对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; 
     } 
    } 
} 
+0

“的旗语从未递减计数器”读旗语柜台里面是不是看它是否工作好办法。请尝试正确解释您的问题。 – Euphoric

+0

而不是使用'_data'字段,我认为更好的方法是使用lambda。例如。 '新线程(()=>设置(数据))'。 – svick

+0

信号量不保护任何东西,这是没有必要的。 –

回答

2

您立即启动线程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(); 
}