gpt4 book ai didi

c# - 锁定数据对象的最佳实践

转载 作者:太空狗 更新时间:2023-10-30 01:14:39 26 4
gpt4 key购买 nike

我编写了一个处理大型文本文件的应用程序。在内部,文本文件存储为 DataObject,其中包含多个数据,如文件的行、文件路径等。我可以使用应用程序修改这些文件(分别是数据对象)。因为有些方法很耗时,所以我在任务中运行它们以避免阻塞 UI。现在,使用非阻塞 UI,我想确保用户不会尝试修改当前正在任务中处理的文件,因此我想锁定 DataObject。为此,我认为我可以向 DataObject 类添加一个锁定对象。然后我将以这种方式锁定 DataObject:

public class DataObject {
public object LockObject = new object();
// ...

public DataObject() { }
}

public void timeConsumingMethod(DataObject data) {
Task.Factory.StartNew(new Action(() => {
lock(data.LockObject) {
// do work
}
}));
}

这是要走的路吗?或者有更好的方法吗?

最佳答案

永远不要暴露 LockObject,隐藏实现细节:

private object m_LockObject = new object();

下一期:为什么timeConsumingMethod接收DataObject而不是被在 DataObject 中实现:

public class DataObject {
// locking object is a private implementation detail
private object m_LockObject = new object();

// TheMethod works with "this" DataObject instance, that's why
// the method belongs to DataObject
// let's return Task (e.g. to await it)
// Think on method's name;
public Task TheMethodAsync() {
// Task.Factory.StartNew is evil
return Task.Run(() => {
lock (m_LockObject) {
// ...
}
});
}

...
}

然后调用方法

 public void timeConsumingMethod(DataObject data) {
// When designing public methods do not forget about validation
if (null == data)
throw new ArgumentNullException("data");

// Think on awaiting the Task returned:
// "i run them in a Taks ... to avoid blocking the UI"
// await data.TheMethodAsync();
data.TheMethodAsync();

...
}

关于c# - 锁定数据对象的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42269400/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com