2013-05-25 105 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(); 
}