2014-11-23 110 views
-1

我想從兩個線程訪問列表框。我正在使用兩個鎖定語句,但這不起作用。多線程訪問變量

我的代碼:

public partial class Form1 : Form 
    { 
     private List<LogInfo> logs = new List<LogInfo>(); 

     private static Object lockObj = new Object(); 
     private static Object lockObj0 = new Object(); 

     /* ... */ 

     void fileSystemWatcher_Renamed(object sender, RenamedEventArgs e) 
     { 
      try 
      { 
       ToggleWatcher(false); 
       LogInfo logInfo = new LogInfo(e.ChangeType, GetCurrentTime(), e.FullPath, e.OldName, e.Name); 
       lock (lockObj) 
       { 
        logs.Add(logInfo); 
        listBox1.Items.Add(logInfo.ToString()); 
       } 
      } 
      finally 
      { 
       ToggleWatcher(true); 
      } 
     } 

     void fileSystemWatcher_Detect(object sender, FileSystemEventArgs e) 
     { 
      try 
      { 
       ToggleWatcher(false); 
       LogInfo logInfo = new LogInfo(e.ChangeType, GetCurrentTime(), e.FullPath); 
       lock (lockObj) 
       { 
        logs.Add(logInfo); 


        // Here in below line i get error: invalidoperationexception was unhandled 
        listBox1.Items.Add(logInfo.ToString()); 
       } 
      } 
      finally 
      { 
       ToggleWatcher(true); 
      } 
     } 
    } 

我不知道爲什麼它不工作(我有兩個鎖語句),但我得到的錯誤:InvalidOperationException異常是未處理

我試圖改變lockObj靜態或使用監視器類,但我仍然得到這個相同的錯誤

回答

-1

你沒有說異常的消息是什麼,但我認爲問題是,你試圖訪問UI(當你添加項目到listBox1)從另一個線程。它與鎖定無關;只是只允許UI線程訪問UI。此外

this.Invoke(new Action(() => listBox1.Items.Add(logInfo.ToString()))); 

,注意鎖定和調用UI線程上的操作是昂貴的,如果你需要做的是,必須在UI線程上執行的動作,用Invoke當您處理來自FileSystemWatcher的事件時,必須儘可能快地完成,否則可能會導致FileSystemWatcher的緩衝區溢出並且您錯過了事件。常見的方法是將事件附加到事件處理程序中的線程安全集合,並在另一個線程上處理它們。

+0

爲什麼downvote?我說錯什麼了嗎? – 2014-11-23 01:06:23

+0

謝謝,我會試試看(我沒有點擊downvote) – user3428180 2014-11-23 01:10:39