来自多个线程的DataContext.ExecuteMethodCall

时间:2014-04-09 13:38:32

标签: c# sql multithreading linq-to-sql datacontext

我使用DBML设置了DataContext,并使用ExecuteMethodCall来存储SQL Server数据库上的存储过程。

这个工作正常但是我发现当我同时调用其中两个函数时(通过BackgroundWorkers),第二个线程被阻塞直到第一个完成。

有没有办法同时运行多个ExecuteMethodCalls,还是需要单独的DataContext?

示例函数调用:

public class MyClass: MyDataContext
{
    public MyClass(string connection) : base(connection) 
    {  
    }

    // ...

    [Function(Name = "dbo.get_proposed")]  
    public ISingleResult<Order> get_proposed([Parameter(DbType = "Varchar(20)")] string region)
    {
        IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), region);
        return ((ISingleResult<Order>)(result.ReturnValue));
    }

    [Function(Name = "dbo.get_parent_groups")]
    public ISingleResult<Account> get_parent_groups([Parameter(DbType = "VarChar(40)")] string group_name)
    {
        IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), group_name);
        return ((ISingleResult<Account>)(result.ReturnValue));
    }

    // ...
}

锁定发生在ExecuteMethodCall,并且在第一个线程完成之前不会返回控制。

1 个答案:

答案 0 :(得分:2)

根本不能同时使用DataContext。文档并没有说这是安全的。除非文档另有说明,否则对象上的所有并发活动都是不安全的。

每个帖子使用一个DataContext