2012-12-02 182 views
0

我有這樣的:轉換爲異步,伺機使用異步目標包

private void BtnCheckClick(object sender, EventArgs e) 
{ 
     var a = txtLot.Text; 
     var b = cmbMcu.SelectedItem.ToString(); 
     var c = cmbLocn.SelectedItem.ToString(); 
     btnCheck.BackColor = Color.Red; 
     var task = Task.Factory.StartNew(() => 
          Dal.GetLotAvailabilityF41021(a, b, c)); 
     task.ContinueWith(t => 
     { 
       btnCheck.BackColor = Color.Transparent; 
       lblDescriptionValue.Text = t.Result.Description; 
       lblItemCodeValue.Text = t.Result.Code; 
       lblQuantityValue.Text = t.Result.AvailableQuantity.ToString(); 
     },TaskScheduler .FromCurrentSynchronizationContext()); 
     LotFocus(true); 
} 

,我跟着J.飛碟雙向的建議遷入異步,等待我的.NET 4.0的應用程序。我轉換成這樣:

private async void BtnCheckClick(object sender, EventArgs e) 
{ 
     var a = txtLot.Text; 
     var b = cmbMcu.SelectedItem.ToString(); 
     var c = cmbLocn.SelectedItem.ToString(); 
     btnCheck.BackColor = Color.Red; 
     JDEItemLotAvailability itm = await Task.Factory.StartNew(() => Dal.GetLotAvailabilityF41021(a, b, c)); 
     btnCheck.BackColor = Color.Transparent; 
     lblDescriptionValue.Text = itm.Description; 
     lblItemCodeValue.Text = itm.Code; 
     lblQuantityValue.Text = itm.AvailableQuantity.ToString(); 
     LotFocus(true); 
} 

它工作正常。令我困惑的是,我可以在不使用任務的情況下完成任務,而只需要使用我的Dal的方法。但那意味着我必須修改我的Dal方法,這是我不想要的?

如果有人會用「簡單」的語言向我解釋我所做的是最佳與否以及爲什麼,我將不勝感激。

謝謝

P.我的達爾法

public bool CheckLotExistF41021(string _lot, string _mcu, string _locn) 
{ 
     using (OleDbConnection con = new OleDbConnection(this.conString)) 
     { 
       OleDbCommand cmd = new OleDbCommand(); 
       cmd.CommandText = "select lilotn from proddta.f41021 " + 
             "where lilotn = ? and trim(limcu) = ? and lilocn= ?"; 
       cmd.Parameters.AddWithValue("@lotn", _lot); 
       cmd.Parameters.AddWithValue("@mcu", _mcu); 
       cmd.Parameters.AddWithValue("@locn", _locn); 
       cmd.Connection = con; 
       con.Open(); 
       OleDbDataReader rdr = cmd.ExecuteReader(); 
       bool _retval = rdr.HasRows; 
       rdr.Close(); 
       con.Close(); 
       return _retval; 
     } 
} 
+0

你能展示一些dal代碼plesae嗎?爲什麼以及如何改變它? –

+0

它是一個OleDbconnection的簡單OledbDataReader。與改變我知道,如果ididnt使用任務,我將不得不decoratemy dal方法與異步和等待提取聲明? – e4rthdog

+0

@ArsenMkrt:我加了dal方法。 – e4rthdog

回答

3

不,這不是最佳的。如果您不能將DAL層更改爲異步,則通過使用async/await不會獲得太多收益。你只是在一個單獨的後臺線程中運行你的阻塞DAL方法。如果你想獲得真正的收益,你應該修改你的DAL方法以使用異步ADO.NET,a.k.a BeginXXX和EndXXX方法。一旦你這樣做,你將從I/O完成端口中獲得真正的好處。在執行數據庫調用期間,線程永遠不會受到危害。

如果你不能修改你的DAL方法,不管你是使用JDEItemLotAvailability itm = await Task.Factory.StartNew(() => Dal.GetLotAvailabilityF41021(a, b, c));還是手動創建線程,真的,你什麼也得不到。

+0

我明白了。我在這個特定的應用程序(這非常簡單)中的主要關注點是在執行dal操作時不會鎖定主窗體。這些dal操作非常簡單快捷。謝謝。 – e4rthdog

+1

那麼,然後在單獨的線程中運行它們應該足夠了。您將不再阻止主線程。但是,既然您已經問過最佳解決方案,就您而言,這將修改您的DAL方法以使用異步ADO.NET。 –

+1

這是「不是最優」的,因爲它會在db操作進行時綁定一個線程池線程。但從GUI應用中實現「異步」操作的主要目標來看,它是完美的「最佳」:提高了響應能力。 –