zoukankan      html  css  js  c++  java
  • 异步 SqlCommand

    从ADO.NET 2.0开始,SqlCommand就新增了几个异步方法执行SQL命令。相对于同步执行方式,它使主线程不需要等待数据库的返回结果,在使用复杂性查询或批量插入时将有效提高主线程的效率。使用异步SqlCommand的时候,请注意把ConnectionString 的 Asynchronous Processing 设置为 true 。

    注意:SqlCommand异步操作的特别之处在于线程并不依赖于CLR线程池,而是由Windows内部提供,这比使用异步委托更有效率。但如果需要使用回调函数的时候,回调函数的线程依然是来自于CLR线程池的工作者线程。

    SqlCommand有以下几个方法支持异步操作:

    public IAsyncResult BeginExecuteNonQuery (......)
    public int EndExecuteNonQuery(IAsyncResult)

    public IAsyncResult BeginExecuteReader(......)
    public SqlDataReader EndExecuteReader(IAsyncResult)

    public IAsyncResult BeginExecuteXmlReader (......)
    public XmlReader EndExecuteXmlReader(IAsyncResult)

    由于使用方式相似,此处就以 BeginExecuteNonQuery 为例子,介绍一下异步SqlCommand的使用。首先建立connectionString,注意把Asynchronous Processing设置为true来启动异步命令,然后把SqlCommand.CommandText设置为 WAITFOR DELAY "0:0:3" 来虚拟数据库操作。再通过BeginExecuteNonQuery启动异步操作,利用轮询方式监测操作情况。最后在操作完成后使用EndExecuteNonQuery完成异步操作。

    复制代码
     1     class Program
    2 {
    3 //把Asynchronous Processing设置为true
    4 static string connectionString = "Data Source=LESLIE-PC;Initial Catalog=Business;“+
    5 "Integrated Security=True;Asynchronous Processing=true";
    6
    7 static void Main(string[] args)
    8 {
    9 //把CLR线程池最大线程数设置为1000
    10 ThreadPool.SetMaxThreads(1000, 1000);
    11 ThreadPoolMessage("Start");
    12
    13 //使用WAITFOR DELAY命令来虚拟操作
    14 SqlConnection connection = new SqlConnection(connectionString);
    15 SqlCommand command = new SqlCommand("WAITFOR DELAY '0:0:3';", connection);
    16 connection.Open();
    17
    18 //启动异步SqlCommand操作,利用轮询方式监测操作
    19 IAsyncResult result = command.BeginExecuteNonQuery();
    20 ThreadPoolMessage("BeginRead");
    21 while (!result.AsyncWaitHandle.WaitOne(500))
    22 Console.WriteLine("Main thread do work........");
    23
    24 //结束异步SqlCommand
    25 int count= command.EndExecuteNonQuery(result);
    26 ThreadPoolMessage("\nCompleted");
    27 Console.ReadKey();
    28 }
    29
    30 //显示线程池现状
    31 static void ThreadPoolMessage(string data)
    32 {
    33 int a, b;
    34 ThreadPool.GetAvailableThreads(out a, out b);
    35 string message = string.Format("{0}\n CurrentThreadId is {1}\n "+
    36 "WorkerThreads is:{2} CompletionPortThreads is :{3}\n",
    37 data, Thread.CurrentThread.ManagedThreadId, a.ToString(), b.ToString());
    38 Console.WriteLine(message);
    39 }
    40 }
    复制代码

    注意运行结果,SqlCommand的异步执行线程并不属于CLR线程池。

    如果觉得使用轮询方式过于麻烦,可以使用回调函数,但要注意当调用回调函数时,线程是来自于CLR线程池的工作者线程。

    复制代码
     1     class Program
    2 {
    3 //把Asynchronous Processing设置为true
    4 static string connectionString = "Data Source=LESLIE-PC;Initial Catalog=Business;”+
    5 “Integrated Security=True;Asynchronous Processing=true";
    6 static void Main(string[] args)
    7 {
    8 //把CLR线程池最大线程数设置为1000
    9 ThreadPool.SetMaxThreads(1000, 1000);
    10 ThreadPoolMessage("Start");
    11
    12 //使用WAITFOR DELAY命令来虚拟操作
    13 SqlConnection connection = new SqlConnection(connectionString);
    14 SqlCommand command = new SqlCommand("WAITFOR DELAY '0:0:3';", connection);
    15 connection.Open();
    16
    17 //启动异步SqlCommand操作,并把SqlCommand对象传递到回调函数
    18 IAsyncResult result = command.BeginExecuteNonQuery(
    19 new AsyncCallback(AsyncCallbackMethod),command);
    20 Console.ReadKey();
    21 }
    22
    23 static void AsyncCallbackMethod(IAsyncResult result)
    24 {
    25 Thread.Sleep(200);
    26 ThreadPoolMessage("AsyncCallback");
    27 SqlCommand command = (SqlCommand)result.AsyncState;
    28 int count=command.EndExecuteNonQuery(result);
    29 command.Connection.Close();
    30 }
    31
    32 //显示线程池现状
    33 static void ThreadPoolMessage(string data)
    34 {
    35 int a, b;
    36 ThreadPool.GetAvailableThreads(out a, out b);
    37 string message = string.Format("{0}\n CurrentThreadId is {1}\n "+
    38 "WorkerThreads is:{2} CompletionPortThreads is :{3}\n",
    39 data, Thread.CurrentThread.ManagedThreadId, a.ToString(), b.ToString());
    40
    41 Console.WriteLine(message);
    42 }
    43 }
    复制代码

    运行结果:

  • 相关阅读:
    如何实现分页功能
    学习Python的心路历程
    Python基础---协程
    Python基础---线程
    Python基础---python中的进程操作
    Python基础---进程相关基础
    Python基础---并发编程(操作系统的发展史)
    Python基础---网络编程3
    Python基础---网络编程2
    Python基础---面向对象3
  • 原文地址:https://www.cnblogs.com/meilibao/p/2725744.html
Copyright © 2011-2022 走看看