SQL Server异步执行?
问题描述:
我正在寻找一种让我的C#(4.0)应用程序异步发送数据到SQL Server 2008实例的方法。我有点像我在http://nayyeri.net/asynchronous-command-execution-in-net-2-0看到的,但那不是我正在寻找的东西。SQL Server异步执行?
我有这样的代码:
// myDataTable is a .NET DataTable object
SqlCommand sc= new SqlCommand("dbo.ExtBegin", conn);
SqlParameter param1 = sc.Parameters.AddWithValue("@param1", "a");
SqlParameter param2 = sc.Parameters.AddWithValue("@param2", "b");
SqlParameter param3 = sc.Parameters.AddWithValue("@param3", myDataTable);
param3.SqlDbType = SqlDbType.Structured;
param3.TypeName = "dbo.MyTableType";
int execState = sc.ExecuteNonQuery();
而且由于myDataTable可能非常大,我不想控制台应用程序挂起,而它的数据发送到服务器,如果有6个大负荷我希望他们都在同一时间在控制台应用程序没有阻塞。我不想连续发送。
所有想法表示感谢,谢谢!
答
- 将连接字符串上的
AsynchronousProcessing
属性设置为True。 - 使用
BeginExecuteNonQuery
但什么是dbo.ExtBegin
在做什么?这一切都依赖于它,因为调用可能会在数据库中的锁上进行序列化(最多),或者最坏的情况下,如果该过程未针对协调性进行适当设计,则可能会得到不正确的结果。
答
创建一个线程并在该线程内执行查询,确保不会导致会导致竞争条件的后续数据库调用。
答
我首先想到的是为插入产生一个新线程,并让主线程使用AutoResetEvent,TimerCallback和Timer对象检查衍生线程的执行。
我在Silverlight中一直这样做。
答
看看使用Service Broker Activation。这将允许你调用一个存储过程并让它在它自己的线程上运行,为什么你继续在当前线程上运行。
Here is an excellent article该问题反复出现。
谢谢,我想你只是给了我正确的文字组合给websearch。我还会看看数据库方面,看看它是否可以在接收存储过程中实际处理并发呼叫。 Service Broker因为额外的服务器配置开销而关闭。我不想添加自定义线程代码,我认为BeginExecuteNonQuery可能会为我做。谢谢。 – Snowy 2011-03-18 20:06:37