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;
}
如何实现。我没有工作。
答案 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()方法