【发布时间】:2017-07-07 14:58:35
【问题描述】:
我已经阅读了许多关于这个主题的帖子,但我仍然有点模糊 C# 在从多个线程调用时如何处理方法中的参数。
我有一系列实用方法需要从大约 60 多个线程中调用。这是一个每天为大约 20,000-30,000 名患者下载患者数据的过程。大多数情况下,这些方法看起来像这样。
Public Static SomeClass
{
public static string StringToSQLBool(string s)
{
if (s.Trim() == "")
{
return "Null";
}
else
{
if (s.ToLower() == "true")
{
return "1";
}
{
return "0";
}
}
}
public static string DateToSQLAnsiStr(string ADate)
{
try
{
if (ADate.Trim() != "")
{
DateTime d = Convert.ToDateTime(ADate);
return "{d '" + d.Year.ToString() + "-" +
d.Month.ToString().PadLeft(2, '0') + "-" +
d.Day.ToString().PadLeft(2, '0') + "'}";
}
else
{
return "Null";
}
}
catch
{
return "Null";
}
}
}
据我了解,只要在方法中使用的参数对调用线程来说是单数的,那么它就被认为是安全的。
这些在没有锁定的情况下是线程安全的吗?
【问题讨论】:
-
它们是字符串。字符串是不可变的。是的,只要作为参数传递的引用类型仅在该线程内访问,那么就不需要锁定等。如果您将一个类实例传递给两个单独的线程然后开始尝试操作相同的线程,这只是一个问题变量。
-
您只展示了单线程代码,因此我们无法评论您未展示的操作的安全性。
-
您的代码似乎根本错误。这意味着您构建一串单独的部分来获取 SQL 查询,例如
var sqlQuery = "update tableName set column1 = '" + text + "' where id = " + 1;这种构建 SQL 查询的方式有很多问题,例如 SQL 注入 (stackoverflow.com/questions/601300),您必须处理不同的类型对自己(就像你正在做的那样)和他人的价值。你应该总是使用参数化查询!!! -
@RandRandom,这不是我要做的。
-
请问你的代码是干什么用的?
标签: c# multithreading parameters thread-safety