c#:控制从不同线程访问对象

Moo*_*oon 0 .net c# multithreading thread-safety

如何控制允许线程访问对象的时间以及何时不允许该线程访问对象.

例如,如果我有下面的情况,我想确保当我在ButtonClick事件中使用objFoo做某事时,我不能从我的doSomethingWithObjFoo方法触摸objFoo.

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
}
Run Code Online (Sandbox Code Playgroud)

Fre*_*örk 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
    }
}
Run Code Online (Sandbox Code Playgroud)

还有其他选项,例如使用a ReaderWriterLockSlim.