asmx服务中的线程安全问题c#

时间:2013-11-19 12:37:39

标签: c# multithreading thread-safety asmx

我有一个问题,我认为可能是与线程安全相关的问题。我创建了一个“简化”版本的代码,试着看看我是否可以解决任何线程安全问题。

无论我多久运行一次,我都没有遇到线程安全问题。我可以假设这个“测试”代码是线程安全的吗?

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; }
}

为了确保我的测试代码正确代表我的实际代码,这是逻辑流程:

  1. 外部系统(由控制台应用程序代表)
  2. 同时发送多个呼叫(由多个线程表示)
  3. 到ASMX服务(由'AsmxService'类表示)
  4. 调用静态类(由'StaticImport'表示)
  5. 执行SQL查找(由列表查找字段表示)
  6. 一些验证(由Console.WriteLine表示)
  7. 然后经过一些验证后,查找实例用于将一些内容导入数据库
  8. 我的问题是,在最后一步(7),由于线程安全问题,查找值(步骤5)是否有可能发生变化?

    提前谢谢。

1 个答案:

答案 0 :(得分:1)

这看起来ThreadSafe但是如果写入List则不是,在这种情况下;事实并非如此。

例如,如果从数据库填充集合,并且某些其他程序写入数据库,则会发生冲突。

如果它只是只读的,那么你的确很好。但是,查看lock语句(http://msdn.microsoft.com/en-us/library/vstudio/c5kehkcz.aspx

仍然是明智之举

并阅读一些关于乐观和悲观数据库锁定的内容。 (Optimistic vs. Pessimistic locking