我對理解多線程有問題。我會盡力解釋並希望你明白我的意思。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
阻塞。
我很困惑。您不需要使用'lock'來同步從類派生的對象(內存中的數據結構)。你需要'lock'來同步程序流程(即線程)。你是什麼意思*將所有線程與第二個工作類* – Benj
同步,而不是試圖用文字解釋,也許你應該嘗試用代碼解釋。 – psubsee2003
我很抱歉,我鎖定了程序流程。我會嘗試添加一些代碼 – lalelu