在所有函数中使用公共strSQL变量

时间:2019-02-26 09:05:12

标签: vb.net multithreading

我继承了一个应用程序,该应用程序使用在模块中声明的公共变量strSQL,并将其用于使用SQL查询的所有函数/子程序中。大概是为了避免在每个函数中声明字符串。

例如

Public strSQL as String

Public Shared Function DoStuff() 
strSQL = "SELECT * FROM XYZ"
    'Do SQL bit
End Function

Public Shared Function DoOtherStuff()
strSQL = "SELECT * FROM ABC"
    'Do SQL bit
End Function

如果在调用DoStuff()之后并为strSQL分配了SELECT * FROM XYZ,但是在SQL位中使用strSQL之前,另一个函数{{1} }被称为DoOtherStuff

strSQL = "SELECT * FROM ABC"是否有可能从DoStuff返回结果?

1 个答案:

答案 0 :(得分:0)

在多线程的情况下,最好使用此变量锁定部分代码,以避免出现以下情况:两个线程共享此变量,而一个线程尝试从XYZ表中获取数据,而另一个线程尝试从ABC表中获取数据。

如您所见,您可以分配SQL语句,然后其他线程将分配其他SQL语句,该线程将执行先前的线程(期望它最初已分配了语句)。

我建议使用Semaphore之类的东西来保证线程安全。或者,您也可以使用SyncLock(在VB.NET中相当于C#lock)。

另一种方法是在函数中使用局部范围的变量,这样线程就不会共享保存该语句的变量。