【发布时间】:2013-11-19 20:47:03
【问题描述】:
我有一个我认为可能与线程安全相关的问题。我创建了我的代码的“简化”版本,以尝试查看是否可以解决任何线程安全问题。
无论我多久运行一次,我都不会遇到线程安全问题。我可以假设这个“测试”代码是线程安全的吗?
class Program
{
static void Main()
{
Random random = new Random();
for (int i = 0; i < 10; i++)
{
new Thread(new AsmxService().Go).Start(random.Next(1, 10));
}
Console.Read();
}
}
public class AsmxService
{
public void Go(object obj)
{
StaticImport.Import((int)obj);
}
}
public class StaticImport
{
public static List<Lookup> lookups = new List<Lookup>()
{
new Lookup(1, "No. 1"),
new Lookup(2, "No. 2"),
new Lookup(3, "No. 3"),
new Lookup(4, "No. 4"),
new Lookup(5, "No. 5"),
new Lookup(6, "No. 6"),
new Lookup(7, "No. 7"),
new Lookup(8, "No. 8"),
new Lookup(9, "No. 9"),
new Lookup(10, "No. 10")
};
public static void Import(int id)
{
Lookup lu = lookups.First(l => l.Id == id);
Console.WriteLine("Go lookup, Id: {0} & Name: {1}", lu.Id, lu.Name);
// Import here
if (lu.Id != id)
{
throw new Exception(string.Format("Thread Safety issue! Id passed in: {0}, Id on instance: {1}***", id, lu.Id));
}
else
{
Console.WriteLine("Successful!");
}
}
}
public class Lookup
{
public Lookup(int id, string name)
{
this.Id = id;
this.Name = name;
}
public int Id { get; set; }
public string Name { get; set; }
}
为了确保我的测试代码正确地代表我的实际代码,下面是逻辑流程:
- 外部系统(由控制台应用程序表示)
- 同时发送多个调用(由多个线程表示)
- 到 ASMX 服务(由“AsmxService”类表示)
- 调用静态类(由“StaticImport”表示)
- 对 SQL 进行查找(由 List 查找字段表示)
- 一些验证(由 Console.WriteLine 表示)
- 然后经过一些验证,用于将一些东西导入数据库的查找实例
我的问题是,在最后一步 (7.) 中,查找值(步骤 5.)是否可能由于线程安全问题而改变?
提前谢谢你。
【问题讨论】:
-
我没有看到您以任何方式更改代码中的查找值。只要您只阅读它,您就不应该有任何线程安全问题(如果您正在动态更新 Lookup 值,您可能会遇到这个问题。但我不能说这是否是一个问题,因为您没有提供任何代码来阅读 Lookup值)。
标签: c# multithreading thread-safety asmx