我使用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,并且在第一个线程完成之前不会返回控制。
答案 0 :(得分:2)
根本不能同时使用DataContext
。文档并没有说这是安全的。除非文档另有说明,否则对象上的所有并发活动都是不安全的。
每个帖子使用一个DataContext
。