我编写了一个处理大型文本文件的应用程序。在内部,文本文件存储为 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/