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

C#-变量值锁定方法(线程),c#,multithreading,thread-safety,locking,C#,Multithreading,Thread Safety,Locking,我在线程方面没有太多经验,但在这个项目中,我需要一些线程通过Com端口从SPS请求数据。 我有不同的线程在运行,可能有2个或更多线程想要访问同一个Com端口,这当然不起作用。 现在我的问题是,我是否可以将被调用的方法锁定在一个变量的值上,该变量是Com端口的编号,而具有不同值的线程可以进入该方法。 顺便说一句:我不能使用不同的变量作为锁的“键”,因为我是从数据库中自动获取值的。 我的代码可能如下所示: Main() { Start different Threads calling myM

我在线程方面没有太多经验,但在这个项目中,我需要一些线程通过Com端口从SPS请求数据。 我有不同的线程在运行,可能有2个或更多线程想要访问同一个Com端口,这当然不起作用。
现在我的问题是,我是否可以将被调用的方法锁定在一个变量的值上,该变量是Com端口的编号,而具有不同值的线程可以进入该方法。
顺便说一句:我不能使用不同的变量作为锁的“键”,因为我是从数据库中自动获取值的。
我的代码可能如下所示:

Main()
{
   Start different Threads calling myMethod
}

myMethod()
{
   lock on value of a Variable
   {
      some code...
   }
}

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

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

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

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

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

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

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

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

您需要使用引用类型作为锁对象,这样Com端口号就不起作用了。这取决于一些代码。。。你必须锁定什么?这里的问题是什么?你需要使用一个引用类型作为锁定对象,这样Com端口号就不起作用了。这取决于一些代码。。。您必须锁定什么?这里的问题是什么?如果
某些代码…
使用的共享资源不是每个端口都初始化的,那么这也不是线程安全的。此外,如果以后可以修改此词典,您应该使用
ConcurrentDictionary
您是对的!ConcurrentDictionary是正确的使用对象-我编辑了我的答案。关于你的另一点,你当然是正确的,但是OP没有指定他使用的对象,因此不可能给出一个涵盖所有共享资源的具体示例。如果
某些代码…
使用的共享资源不是每个端口都初始化的,这也不是线程安全的。此外,如果以后可以修改此词典,您应该使用
ConcurrentDictionary
您是对的!ConcurrentDictionary是正确的使用对象-我编辑了我的答案。关于你的另一点,你当然是正确的,但是OP没有指定他使用的对象,因此不可能给出一个涵盖所有共享资源的具体示例。
lock(locks[portnum])
{
    some code...
}