使用Command 物件進行非同步操作

iDotNetSpace發表於2008-09-28

  在ado.net2.0發步這前,通過Command執行sql命令的執行緒必須等待執行結果.現在需要確保當儲存過程在執行時,應用程式任能響應使用者請求.
 
  下面我們來看一個最簡單的例項:

 

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt        SqlConnection conn =new SqlConnection ("server=.\\sqlexpress;database=wtqtest;Integrated Security=sspi;");

        
private void button1_Click(object sender, EventArgs e)
        {
            
try
            {
               conn.Open();
                
string strCmd = "waitfor delay '00:00:05';select fname from mytable1";
                SqlCommand cmd 
= new SqlCommand(strCmd, conn);

                SqlDataReader dr 
= cmd.ExecuteReader();
                
while (dr.Read())
                {
                    
this.textBox1.Text += dr[0].ToString();
                }

            }
            
catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

 

//在這裡,是連線的2005資料庫,大家應該看到了此連線要沿時05秒鐘,而在這05秒內你是什麼也不能做的,你的應用程式會處於一種"卡死"狀態.
       
        下面我們改一改 try 裡的程式碼,並且在連線字串中加上"Asynchronous Processing=true",其它程式碼不變:

 

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt try
            {
                conn.Open();
                
string strCmd = "waitfor delay '00:00:05';select fname from mytable1";
                SqlCommand cmd 
= new SqlCommand(strCmd, conn);

                IAsyncResult result 
= cmd.BeginExecuteReader();//當執行到這段程式碼時就開始開始執行sql語句了

                
while (!result.IsCompleted) //判斷是否已經完成sql語句查詢完成,如果沒完成就可以執行其它程式碼
                {
                    MessageBox.Show(
"正在等待sql執行..!");//在這裡可以新增非同步程式碼
                }//在五秒鐘的等待中,它將不斷的顯示這個對話方塊.表明程式並沒有"卡死".
                 
                
//如果已經完成查詢就可以把結果傳給 dr 並用dr.Read()讀取結果
                using (SqlDataReader dr = cmd.EndExecuteReader(result))
                {
                    
while (dr.Read())
                    {
                        
this.textBox1.Text += dr[0].ToString();
                    }
                }
                conn.Close();
            }

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-466022/,如需轉載,請註明出處,否則將追究法律責任。

相關文章