2012-01-07 24 views
4

我試圖阻止我的程序在任何給定的時間運行多個實例。我已經閱讀過有關使用互斥鎖和窗口事件的消息,但是這兩個線程都有幾年了,我很好奇,如果使用.net4,有更簡單,更優雅的方法來處理這個問題?我以爲我已經閱讀過有關允許您拒絕該屬性的多個實例的表單設置?是否有人能夠說明防止多個程序實例最安全和/或最簡單的方法?防止多個程序實例最安全的方法是什麼?

+11

最安全的方法是使用.NET中的內置支持WindowsFormsApplicationBase.IsSingleInstance屬性。很難猜測是否合適,您沒有花費很多精力描述您的確切需求。不,過去5年沒有任何變化。 – 2012-01-07 00:38:35

+0

創建一個指定事件。承擔該怎麼辦呢[這裏]看看[1] [1]:http://stackoverflow.com/questions/447546/creating-win32-events-from-c-sharp – Odys 2012-01-07 00:42:49

+0

如果漢斯你會做出評論一個實際的答案,我會獎勵你選擇的答案。 – 2012-01-22 20:09:10

回答

4

最安全的方法是使用.NET中的內置支持WindowsFormsApplicationBase.IsSingleInstance屬性。很難猜測是否合適,您沒有花費很多精力描述您的確切需求。不,過去5年沒有任何變化。 - Hans Passant 1月7日0:38

這是最好的答案,但漢斯沒有提交它作爲答案。

3

在VB中,您可以在Winforms項目的項目級別(屬性>常規)中進行設置。

在C#中,你可以使用類似於此代碼..當然需要轉換..

Dim tGrantedMutexOwnership As Boolean = False 
Dim tSingleInstanceMutex As Mutex = New Mutex(True, "MUTEX NAME HERE", tGrantedMutexOwnership) 

If Not tGrantedMutexOwnership Then 
' 
' Application is already running, so shut down this instance 
' 
Else 
' 
' No other instances are running 
' 
End If 

哎呀,我忘了提,你將需要把你的GC.KeepAlive(tSingleInstanceMutex)後Application.Run()調用

1
using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Linq; 
using System.Windows.Forms; 

namespace YourNameSpaceGoesHere 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 

      if (Process.GetProcessesByName("YourFriendlyProcessNameGoesHere").Length > 1) 
      { 
       MessageBox.Show(Application.ProductName + " already running!"); 
       Application.ExitThread(); 
      } 
      else 
      { 
       Application.EnableVisualStyles(); 
       Application.SetCompatibleTextRenderingDefault(false); 
       Application.Run(new YourStartUpObjectFormNameGoesHere()); 
      } 

     } 
    } 
} 
+0

好又幹淨的答案!投票 – Sylca 2013-02-27 12:59:34

相關問題