2015-02-06 51 views
-1

我有這樣的功能:如何使功能的一部分「線程等待」?

protected override void WndProc(ref Message message) { 
    if (id != null) { 
     id.ProcessMessage(message); 

     if (id.ScanCode.Length > 4) { 
      ... 
     } 
    } 

    base.WndProc(ref message); 
} 

這是做低級別的監聽鍵盤輸入,我想已經是多線程的做到這一點。它工作得很好,但它是重要的一塊是功能只允許1個線程同時執行:

if (id.ScanCode.Length > 4) { 
     ... 
} 

我需要整個if區塊,只允許1個線程的時間。一旦線程#1結束,線程#2可以進入並執行。如果可能並且簡單,所有其他線程也可以被中止,因爲當線程到達這一點時,其他線程變得無用。但是,如果這很困難或可能導致不穩定,那就讓我們堅持原來的要求吧。

實現此目的最簡單的方法是什麼? (!在此先感謝)

+1

的WndProc只運行在UI線程上。 – 2015-02-06 17:56:20

回答

3

確保只有一個線程在同一時間進入臨界區的最簡單方法是使用lock聲明:

private static object lockObject = new object(); 

protected override void WndProc(ref Message message) { 
    if (id != null) { 
     id.ProcessMessage(message); 

     lock(lockObject) { 
      if (id.ScanCode.Length > 4) { 
       ... 
      } 
     } 
    } 

    base.WndProc(ref message); 
} 

https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx

+0

看起來很有前途,有些作品,但有時候有兩個線程同時進入。有時候1(好),有時2(壞)。不要超過2(可能會更糟糕)。我會發佈一個新問題,所以請稍等一下。 :-) – HerrimanCoder 2015-02-06 18:20:47

1

一般來說,最好的辦法這是使用Monitor類,它允許您鎖定一段代碼的進入和退出:

eg要監視的對象:

static readonly object _locker = new object(); 

,然後你的代碼:

lock (_locker) { 
    if (id.ScanCode.Length > 4) { 
     ... 
    } 
} 

這是一個很好的參考:http://www.codeproject.com/Tips/788402/Monitor-and-Lock-in-Csharp

+0

啊......被打了一分鐘......!保羅說:-) – Elliveny 2015-02-06 18:00:39

+0

Elliveny:謝謝你跳得這麼快,但是你的錯誤在你:鎖(_object)而不是鎖(_locker) - 保羅是正確的,所以我把它授予他。如果你想採取刺法,我會在一分鐘後問一個後續問題。最新帖子。 – HerrimanCoder 2015-02-06 18:22:39

+0

哎呀!固定..謝謝SweatCoder – Elliveny 2015-02-06 18:48:43