多个线程访问同一个实例

时间:2014-05-22 06:07:31

标签: c# .net multithreading thread-safety

ObservableCollection<MyClass> collection = new ObservableCollection<MyClass>();
public MainWindow()
{
    InitializeComponent();
    collection.Add(new MyClass() { Name = "Vikram" });
    collection.Add(new MyClass() { Name = "Test" });          

    CallingTaskDelay();          
    MyClass class1 = collection[0];
    lock (class1)
    {
        txtName.Text = class1.Name;
    }
}

private Task TaskDelayMethod()
{           
    return Task.Run(() => ChangeItem());
}

private async void CallingTaskDelay()
{
    await TaskDelayMethod();
}

private void ChangeItem()
{
    MyClass myclass = collection[0];
    lock (myclass)
    {
        myclass.Name = "anup";
        Thread.Sleep(5000);
    }
}

我在ChangeItem()方法中更改myclass实例的内容。我想阻止在MainWindow()方法中访问同一个实例,我正在做如下 -

lock (class1)
{
     txtName.Text = class1.Name;
}

如何实现。我没有工作。

3 个答案:

答案 0 :(得分:0)

通常最好让private object用作锁,但只要MyClass是引用类型,您所做的就应该有效。我认为构造函数中的代码在ChangeItem启动之前执行,因此您没有看到任何争用。尝试在Thread.Sleep(1000)之后加CallingTaskDelay()

答案 1 :(得分:0)

我猜你有一个&#34;竞争条件&#34;。在构造函数中获取ChangeItem时,可能尚未调用lock (class1)。否则,您的代码应该按预期工作。

您可以通过添加一些睡眠来检查它。

CallingTaskDelay();
Thread.Sleep(100);//For debugging, just give some time for  `CallingTaskDelay` to call `ChangeItem`
MyClass class1 = collection[0];
lock (class1)
{
    txtName.Text = class1.Name;
}

答案 2 :(得分:0)

您是否希望在构造函数完成之前运行ChangeItem()方法?使用async关键字指示编译器在启动之前等待它没有其他任何操作。在给定的场景中,在构造函数完成后将始终调用ChangeItem()方法