我有这个:
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. Skeet的建议进入异步,等待我的.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);
}
工作正常。让我感到困惑的是,我可以不使用Task而只使用我的Dal方法。但这意味着我必须修改我的Dal方法,这是我不想要的东西?
如果有人会用“简单”的话向我解释我的所作所为是最优的还是没有,我会很感激。
由于
P.S。我的dal方法
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 :(得分: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));
还是手动创建线程,实际上,您什么也得不到。