2009-06-18 35 views
1

我有一個應用程序「myprogram.exe」,它調用dll中的函數和代碼,其中一個「myprogram.exe」調用的函數創建一個winform的新實例「MyForm.cs」,然後顯示它使用form.show();.如何避免多個應用程序實例?

我可以運行'n'個「myprogram.exe」實例,但我希望每個「myprogram.exe」實例只有一個「MyForm.cs」實例。

我遇到的問題是,甚至認爲我在「MyForm.cs」中使用互斥來創建互斥鎖,並且他們詢問它的實例是否已經在運行,有時它會創建另一個實例,儘管互斥鎖。

是否有另一種方法可以用來驗證「myprogram.exe」的實例是否已經創建了「MyForm.cs」實例。

+0

請參閱http://stackoverflow.com/questions/229565/what-is-a-good-pattern-for-using-a-global-mutex-in -c/229567和http://stackoverflow.com/questions/819773/run-single-instance-of-an-application-using-mutex – Noldorin 2009-06-18 23:10:02

+0

我猜你對互斥體做了錯誤;一般來說,如果互斥體沒有完成他們的工作,將會出現嚴重問題。 – Joe 2009-06-19 02:04:02

回答

4

根據@ Joe的評論,問題可能在於Mutux的實現。

This answer to another question證明這樣做的正確方法:

K.斯科特·艾倫a good write up上使用互斥爲了這個目的,你會遇到與GC的問題。

如果我想只有一個橫跨機器上的所有會話中運行的應用程序的情況下,我可以把命名的互斥體與前綴「全球\」的全局命名空間。

[STAThread] 
static void Main() 
{ 
    using(Mutex mutex = new Mutex(false, "Global\\" + appGuid)) 
    { 
     if(!mutex.WaitOne(0, false)) 
     { 
     MessageBox.Show("Instance already running"); 
     return; 
     } 

Application.Run(new Form1()); 
    } 
} 
相關問題