2010-09-30 84 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. 
     } 
    } 

}