【问题标题】:SQL Server Asynchronous Execute?SQL Server 异步执行?
【发布时间】:2011-03-18 19:20:52
【问题描述】:

我正在寻找一种方法让我的 C# (4.0) 应用程序将数据异步发送到 SQL Server 2008 实例。我有点喜欢我在http://nayyeri.net/asynchronous-command-execution-in-net-2-0 看到的东西,但这并不是我想要的。

我有这样的代码:

// 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 个大负载,我希望它们同时运行而不会在控制台阻塞应用程序。我不想串行发送。

感谢所有想法,谢谢!

【问题讨论】:

    标签: sql-server ado.net asynchronous


    【解决方案1】:

    但是dbo.ExtBegin 在做什么呢?这一切都取决于它,因为调用可能会很好地序列化数据库中的锁(最好的情况),或者最坏的情况是,如果过程没有为并发性而正确设计,您可能会得到不正确的结果。

    【讨论】:

    • 谢谢,我认为您刚刚为我提供了正确的网络搜索字词组合。我还将查看数据库端,看看它是否真的可以在其接收存储过程中处理并发调用。由于额外的服务器配置开销,Service Broker 已退出。我不想添加自定义线程代码,我认为 BeginExecuteNonQuery 可能会为我做。谢谢。
    【解决方案2】:

    创建一个线程并在该线程中执行查询,确保不会有可能导致竞争条件的后续数据库调用。

    【讨论】:

      【解决方案3】:

      我的第一个想法是为插入生成一个新线程,并让主线程使用 AutoResetEvent、TimerCallback 和 Timer 对象检查生成的线程的执行情况。

      我一直在 Silverlight 中这样做。

      【讨论】:

        【解决方案4】:

        看看使用Service Broker Activation。这将允许您调用存储过程并让它在它自己的线程上运行,为什么您要在当前线程上继续。

        Here is an excellent article 说明了如何执行此操作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多