【发布时间】:2017-02-16 09:10:09
【问题描述】:
我编写了一个处理大型文本文件的应用程序。在内部,文本文件存储为 DataObject,其中包含多个数据,例如文件的行、文件路径等。我可以使用应用程序修改这些文件(分别是数据对象)。因为有些方法很耗时,所以我在 Task 中运行它们以避免阻塞 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
}
}));
}
这是要走的路吗?还是有更好的办法?
【问题讨论】:
-
我喜欢建议的解决方案,如果您尝试从对象中读取,我会小心 - 这可能会导致同时写入/读取的问题(或者如果您在阅读时忘记锁定它) .我会添加我自己的问题,询问是否应该在
getting/setting值时在属性内完成锁定? -
考虑使用
Task.Run而不是StartNew,即is dangerous -
@VMAtm:我已经阅读了这篇文章。很好的博客。我还没有考虑过。谢谢
标签: c# multithreading locking task