2009-05-02 43 views
8
static Mutex mutex = new Mutex (false, "oreilly.com OneAtATimeDemo"); 

static void Main() 
{ 
    // Wait a few seconds if contended, in case another instance 
    // of the program is still in the process of shutting down. 

    if (!mutex.WaitOne (TimeSpan.FromSeconds (3), false)) 
    { 
     Console.WriteLine ("Another instance of the app is running. Bye!"); 
     return; 
    } 

    try 
    { 
     Console.WriteLine ("Running. Press Enter to exit"); 
     Console.ReadLine(); 
    } 
    finally { mutex.ReleaseMutex(); } 
} 

http://www.albahari.com/nutshell/ch20.aspxSử dụng phương pháp

WaitOne() Trong mã này:

if(mutex.WaitOne(TimeSpan.Zero, true)) 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1()); 
    mutex.ReleaseMutex(); 
} 
else 
{ 
    MessageBox.Show("only one instance at a time"); 
} 

http://sanity-free.org/143/csharp_dotnet_single_instance_application.html

Không có đảo ngược của nếu/bool.

Nếu waitone() là đúng, điều đó có nghĩa là một cá thể đang chạy? Nếu true được trả về, luồng hiện tại sẽ bị chặn, điều đó có nghĩa là hai tiến trình gọi cùng một ứng dụng sẽ dừng lại?

hiểu biết của tôi là như sau:

// Don't block the thread while executing code. 
//Let the code finish and then signal for another process to enter 

ngụ ý của không là gì! (trở lại đúng) và ngược lại. Hay nói cách khác, chuyện gì sẽ xảy ra?

Tôi biết waitAll ví dụ, đợi tất cả các chuỗi kết thúc. Jon Skeet đã cho thấy một ví dụ điển hình về điều này trên trang web của anh ấy, vốn đã bị mắc kẹt trong tâm trí tôi (tín dụng cho lời giải thích của anh ấy). Vì vậy, rõ ràng waitOne chờ đợi cho một sợi để kết thúc. Giá trị trả về là điều làm tôi bối rối.

Trả lời

15

Để chờ một mutex có nghĩa là chờ cho đến khi bạn có thể có được nó.

WaitOne trên Mutex sẽ trả về true nếu có thể nhận được mutex trong thời gian đã định. Nếu không thể, phương thức sẽ trả về false. Nếu đã có được mutex, bạn có trách nhiệm giải phóng mutex khi bạn hoàn thành nó.

Nếu bạn có thể có được một mutex được đặt tên, không ai khác sở hữu nó vào lúc này.

Vì vậy, để tóm tắt lại. Nếu bạn có thể có được mutex, phương thức trả về true và bạn là cá thể đầu tiên/duy nhất của ứng dụng của bạn, liên quan đến câu hỏi của bạn.

Nếu bạn không thể có được mutex, phương thức trả về false và có một trường hợp ứng dụng khác hiện đang sở hữu mutex theo tên đó.

1

Trong MSDN mô tả của mutex.WaitOne() là thế này:

Blocks thread hiện hành cho đến khi hiện WaitHandle nhận được một tín hiệu.

Và giá trị trả về là: true nếu Ví dụ hiện nay nhận được một tín hiệu

Vì vậy, cho đến khi ứng dụng được bắt đầu một lần, nó sẽ không nhận được bất kỳ tín hiệu từ phương pháp mute.WaitOne(). Chủ đề bị chặn như đã nói trong phần mô tả.

Vì vậy, để trả lời bạn câu hỏi:

ngụ ý của không là gì! (trở lại đúng) và ngược lại.

Nếu bạn phủ nhận phương pháp mutex.WaitOne(), sau đó bạn sẽ kiểm tra này: Nếu KHÔNG WaitOne(), nó có nghĩa là bạn kiểm tra xem WaitOne không đáp ứng với đúng.

Tôi hy vọng điều này rõ ràng hơn bây giờ.

Các vấn đề liên quan