2015-06-27 23 views
0

我對理解多線程有問題。我會盡力解釋並希望你明白我的意思。c#鎖定類但不是自己

我有一個類form1(繼承自Form)。該表格可以打開多次。當其中一個被打開時,一個工作者線程將從一個全局同步對象開始,我將創建該表單。

所以每個窗體都有相同的對象進行同步。這是必要的,因爲有另一個類可以做一些工作(只有一個對象可以活着)。不允許同時進行這項工作。

我的問題是這樣的:

如何同步與第二類工作的所有線程不會阻塞所有線程?

// from this form can be exist several objects 
public partial class form1 : Form 
{ 
... 
    private Object synchronizedObject; 
    public void SetSynchronizedObject(Object o) 
    { 
     synchronizedObject = o; 
    } 

    // executed threaded 
    public void DoWork() 
    { 
     while (bDoWork) 
     { 
      try 
      { 
       bool bLock = Monitor.TryEnter(synchronizedObject); 
       if (!bLock) 
       { 
        if (bDoWork) 
        { 
         this.BeginInvoke((MethodInvoker)delegate() 
         { 
          if (panel1 != null) 
           panel1.Visible = true; 
         }); 
        } 
        Monitor.Enter(synchronizedObject); 

        if (bDoWork) 
        { 
         this.BeginInvoke((MethodInvoker)delegate() 
         { 
          if (panel1 != null) 
           panel1.Visible = false; 
         }); 
        } 
       } 


       i++; 
       if (bDoWork) 
       { 
        this.BeginInvoke((MethodInvoker)delegate() 
        { 
         if (textBox != null) 
          textBox.Text = i.ToString(); 
        }); 
       } 
      } 
      finally 
      { 
       Monitor.Exit(synchronizedObject); 
      } 

      Thread.Sleep(1); 
     }    
    } 

然後有form2。當form2完成其工作時,應阻止所有線程。我的代碼的問題是form1阻塞。

+1

我很困惑。您不需要使用'lock'來同步從類派生的對象(內存中的數據結構)。你需要'lock'來同步程序流程(即線程)。你是什​​麼意思*將所有線程與第二個工作類* – Benj

+3

同步,而不是試圖用文字解釋,也許你應該嘗試用代碼解釋。 – psubsee2003

+0

我很抱歉,我鎖定了程序流程。我會嘗試添加一些代碼 – lalelu

回答

1

您試圖解決的問題可以用「工作人員」很好地處理。創建一個ConcurrentQueue<T>,在那裏添加「工作」。啓動一個工作線程(一次)

ConcurrentQueue<T> _q; 
void Worker() 
{ 
    while (true) 
    { 
     T element = _q.Dequeue(); 
     if (element == null) 
      break; 
     // do work with element here 
     // obviously, it will happen one at a time 
    } 
} 

例如,在代碼假定你不需要的結果

更好的方法是使用「限制併發的SynchronizationContext」,在這種情況下,你可以使用等待/異步。

+0

我想,那不是我正在尋找的。 – lalelu

0

您想通過使用共享synchronizedObject來同步您的線程。這是一個好主意,但是您確定synchronizedObject確實在所有實例之間共享?有一個非常簡單的方法可以真正確保這一點,而不必使用(可能有問題)SetSynchronizedObject方法。

private static readonly Object synchronizedObject = new object(); 

現在你肯定synchronizedObject的所有實例之間共享。

我不確定這是你實現中的錯誤部分(它取決於你如何調用SetSynchronizedObject),但確保沒有潛在的錯誤是非常容易的。

+0

是的synchronizedObject在所有線程中共享。但這是我不想要的。 form2阻止form1,但表單1不應阻止form1 – lalelu

相關問題