2010-09-30 85 views
0

如何控制何時允許線程訪問某個對象,何時不允許該線程訪問該對象。c#:控制對來自不同線程的對象的訪問

舉例來說,如果我有情況類似下面,我想確保當我做一些與objFoo我ButtonClick事件,我不應該能夠從觸摸objFoodoSomethingWithObjFoo方法。

private void button1_Click(object sender, EventArgs e) { 
    // doing something with objFoo 
} 

private void timer1_Tick(object sender, EventArgs e) { 
    Thread T = new Thread(new ThreadStart(doSomethingWithObjFoo)); 
    T.Start(); 
} 

private void doSomethingWithObjFoo(){ 
    // doing something else with objFoo 
} 

回答

5

最簡單的方法可能是使用lock

private object _fooLock = new object(); 
private void button1_Click(object sender, EventArgs e) { 
    lock(_fooLock) 
    { 
     // doing something with objFoo 
    } 
} 

private void timer1_Tick(object sender, EventArgs e) { 
    Thread T = new Thread(new ThreadStart(doSomethingWithObjFoo)); 
    T.Start(); 
} 

private void doSomethingWithObjFoo(){ 
    lock(_fooLock) 
    { 
     // doing something else with objFoo 
    } 
} 

還有其他的選擇爲好,如使用ReaderWriterLockSlim

+0

我不會嘗試鎖定UI線程上的對象(即在button1_Click處理程序中),除非您確定不必等待很長時間。您的UI將凍結,直到button1_Click處理程序完成。 – 2010-10-03 18:40:22

1

那有什麼關係,我們使用lock進行。

Thread Synchronization是一本必讀書。

public class TestThreading 
{ 
    private System.Object lockThis = new System.Object(); 

    public void Process() 
    { 

     lock (lockThis) 
     { 
      // Access thread-sensitive resources. 
     } 
    } 

}