這是由於Winform中常常都是拖控件導致的,服務器加載時緩慢。因爲如果你的線程多了,那麼當兩個線程同時嘗試將一個控件變爲自己需要的狀態時,線程的死鎖就會發生。但是難道就是因爲這個原因,我們就只能讓程序卡着麼?當然不是,這裏教大家一個解決方案:此時應考慮使用異步加載的辦法,用BackGroundWorke。
使用方法如下:
1.在工具箱中找到 所有Windows窗體,找到BackGroundWorke,拖於界面上
2.點擊事件圖標,添加兩個事件Dowork和RunWorkerCompleted 如:bgwWork_DoWork和bgwWork_RunWorkerCompleted
3.在bgwWork_DoWork事件中填執行SQL語句的代碼,特別注意,此事件中不要出現任何相關於服務器控件的操作,可事先把服務器控件的值賦給參數,然後傳參數進來如下:
private void bgwWork_DoWork(object sender, DoWorkEventArgs e)
{
//poNum, startTime, endTime, wuliaoNum, storeName 通過服務器控件賦值後的參數
SMS.OdateBa.oDataOperate od = new SMS.OdateBa.oDataOperate();
tb = od.Re_MM_PO(poNum, startTime, endTime, wuliaoNum, storeName);
}
4.在bgwWork_RunWorkerCompleted進行綁定操作如下:
private void bgwWork_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
dgvPInfo.DataSource = tb;
dgvPInfo.Rows[dgvPInfo.Rows.Count - 1].Selected = true;
}
5.調用此異步加載方法
如果是在按鈕事件中則如下:
try
{
bgwWork.RunWorkerAsync();//異步調用 此處若反覆點擊按鈕多次會出現 當前正忙,無法同時運行多個任務的異常
}
catch (Exception)
{
MessageBox.Show("正在加載,請稍候!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
}