C# - 对变量值的锁定方法(线程)

时间:2017-02-13 12:19:31

标签: c# multithreading thread-safety locking

我对线程的经验不多,但在这个项目中,我需要一些线程来通过Com-Ports从SPS请求数据。 我有不同的线程运行,可能会发生2个甚至更多的线程想要访问相同的Com-Port,这当然不起作用。
现在我的问题是,我是否可以将变量值的被调用方法锁定为Com-Port的数量,而具有不同值的线程可以输入方法。
顺便说一句:我不能使用不同的变量作为"键"对于锁定,因为我从数据库中获取了值 我的代码可能如下所示:

<div>
  <span>
<p class="sentiment">Sentiment</p>
  </span>
  <span>
<img src="https://storage.googleapis.com/gweb-uniblog-publish-prod/static/blog/images/google.a51985becaa6.png">
  </span>
</div>

1 个答案:

答案 0 :(得分:2)

我认为您最好的解决方案是创建一个包含myMethod的类,并为每个端口实例化它。

如果您不想这样做,您可以(例如)定义一个线程安全的锁字典

public static ConcurrentDictionary<int, object> locks = new ConcurrentDictionary<int, object>(); 

在开始你的线程之前初始化它:

for (int i=0; i < 10; i++)
{
    locks[i] = new object();
}

并按端口号锁定:

lock(locks[portnum])
{
    some code...
}

当然假设您知道myMethod上下文中的端口号(否则您将如何访问特定端口?)。