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

标签 c# multithreading locking task

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

相关文章:

对 SignalR 集线器方法的 Javascript 调用不返回值

java - 从 API 返回响应并在 API 级别执行一些其他操作

mysql - 阻止 MariaDB 锁定进程

Postgresql 共享行独占锁 VS pg_advisory_lock

c# Nhibernate 使用动态参数创建查询

c# - 如何使用Resharper SDK从IClrDeclaredElement获取IDeclaredType

java - 使用 Java 对客户端-服务器应用程序进行单元测试

objective-c - 两个线程调用一个函数 > 局部变量访问需要同步吗?

c - 使用flock, open and close file实现多读单写锁

c# - 如何在运行时提示用户输入——编码的UI自动化测试