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.Skeetのアドバイスに従って非同期に移行し、.NET4.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メソッドを変更したに違いないことを意味します、それは私が望まないものですか?

私がしたことが最適かどうか、そしてその理由を誰かが「わかりやすい」言葉で説明してくれれば幸いです。

ありがとう

Ps私のダルメソッド

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;
        }
}
4

1 に答える 1

3

いいえ、それはまったく最適ではありません。DAL レイヤーを非同期に変更できない場合は、async/await を使用してもあまり効果がありません。別のバックグラウンド スレッド内でブロッキング DAL メソッドを実行しているだけです。本当の利益が必要な場合は、DAL メソッドを変更して非同期 ADO.NET、別名 BeginXXX および EndXXX メソッドを使用する必要があります。これを行うと、I/O Completion Ports から真のメリットが得られます。データベース呼び出しの実行中にスレッドが危険にさらされることはありません。

JDEItemLotAvailability itm = await Task.Factory.StartNew(() => Dal.GetLotAvailabilityF41021(a, b, c));スレッド作成を使用しているか手動で作成しているかに関係なく、DAL メソッドを変更できない場合、実際には何も得られません。

于 2012-12-02T22:43:08.627 に答える