【问题标题】:Multiple threads accessing same instance多个线程访问同一个实例
【发布时间】:2014-05-22 06:07:31
【问题描述】:
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;
}

如何实现。我的不工作。

【问题讨论】:

  • 解释 我的不工作
  • @SriramSakthivel 我展示的场景..它在这里不起作用
  • 不工作可能有任何意义。不编译?例外?给出意外的输出?如果是这样呢?请解释。我们无法猜测
  • @SriramSakthivel :这意味着,我想要的情况是,只要 ChangeItem() 将内容更改为“anup”,我应该无法访问 MainMethod 中的 class1.Name ()。我希望你得到我想要的。谢谢:)

标签: c# .net multithreading thread-safety


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我猜你有一个“比赛条件”。当您在构造函数中获取lock (class1) 时,可能尚未调用ChangeItem。否则,您的代码应该可以按预期工作。

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

    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;
    }
    

    【讨论】:

      【解决方案3】:

      您是否希望在构造函数完成之前运行 ChangeItem() 方法?使用 async 关键字指示编译器等到它无事可做后再启动它。在给定的场景中,ChangeItem() 方法将始终在构造函数完成后调用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-03
        • 2013-07-15
        • 2019-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多