Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 多个互斥对象,用于在多线程情况下处理每个方法_Multithreading_C# 4.0_Ado.net_Thread Safety_Mutex - Fatal编程技术网

Multithreading 多个互斥对象,用于在多线程情况下处理每个方法

Multithreading 多个互斥对象,用于在多线程情况下处理每个方法,multithreading,c#-4.0,ado.net,thread-safety,mutex,Multithreading,C# 4.0,Ado.net,Thread Safety,Mutex,我目前正在用几个方法实现一个单例类。每个方法都使用同一个私有字段,该字段实际上是与数据库的连接。在每种方法中,读者都试图保持开放。如您所见,这是在应用程序的整个范围内共享的单个连接。如果您试图在Ado.Net中打开读卡器连接,而读卡器已经打开,则会发生异常。如果您在打开读卡器后忘记关闭读卡器,则可以打开此案例,但在我的案例中会发生这种情况,因为我使用多个线程来执行某些操作 我的问题是:我必须为每个方法实现不同的互斥对象,还是为所有方法共享一个互斥对象就足够了 我知道单身汉很少有好的模式。我也知道

我目前正在用几个方法实现一个单例类。每个方法都使用同一个私有字段,该字段实际上是与数据库的连接。在每种方法中,读者都试图保持开放。如您所见,这是在应用程序的整个范围内共享的单个连接。如果您试图在Ado.Net中打开读卡器连接,而读卡器已经打开,则会发生异常。如果您在打开读卡器后忘记关闭读卡器,则可以打开此案例,但在我的案例中会发生这种情况,因为我使用多个线程来执行某些操作

我的问题是:我必须为每个方法实现不同的互斥对象,还是为所有方法共享一个互斥对象就足够了

我知道单身汉很少有好的模式。我也知道共享连接不是一个好的实践,但请记住,我的项目是一个winforms项目,被认为是遗留项目。我的客户也不想为重新设计应用程序付费。我只是想知道在这种情况下互斥应该如何处理


非常感谢您的时间。

您需要锁定使用同一对象的所有方法,以便对数据库的每次调用都将逐个完成


您确定不可能在每个方法中创建连接并关闭它吗?我认为这比用锁修复行为更容易:你需要一个互斥锁。如果有多个互斥体控制单个共享资源(在本例中是数据库连接),那么多个线程可以同时访问它,这就破坏了互斥体的作用