3

私は、Web のダウンロード/読み取りを行おうとするときに、非同期の例をたくさん見てきました。しかし、OleDb のサンプルなどを見つけることができませんでした (または、より優れた同等のものはありますか?)。C# 5.0 の新しく簡素化された Async および Await 機能を使用したいと思います。

これは、私が現在 OleDb をどのように使用しているかのほんの一例です。

public void insertTafelloc(int tafelnr, string datum, string tijd)
{
tafelsupdate = false;
try
{
    db.cmd.Connection = db.connection;
    db.connection.Open();
    db.cmd.CommandText = "SELECT * FROM tafels WHERE tafelnr = ? AND datum = ?";
    db.cmd.Parameters.Add(new OleDbParameter("1", tafelnr));
    db.cmd.Parameters.Add(new OleDbParameter("2", datum));
    OleDbDataReader dataReader;
    dataReader = db.cmd.ExecuteReader(CommandBehavior.CloseConnection);
    while (dataReader.Read())
    {
        if (dataReader["tafelnr"].ToString() != "")
        {
            tafelsupdate = true;
        }
    }
    dataReader.Close();
    db.cmd.Parameters.Clear();
    db.connection.Close();
}
catch (Exception ex) { MessageBox.Show(ex.Message); }
}

リクエストに応じて、いくつかのデータ リーダーを次々と実行していますが、新しい結果がフォームに表示されるまでにかなりの時間がかかります。また、OleDb を使用して Access データベースにアクセスしています。

4

1 に答える 1

5

簡単な方法は、DB 操作をタスクにラップすることです。

public async Task DoDbOperationsAsync()
{
    await Task.Run(async () =>
    {
         // Your DB operations goes here

         // Any work on the UI should go on the UI thread

         // WPF
         await Application.Current.Dispatcher.InvokeAsync(() => {
              // UI updates
         });

         // WinForms
         // To do work on the UI thread we need to call invoke on a control
         // created on the UI thread..
         // "this" is the Form instance
         this.Invoke(new Action(() =>
         {
             button1.Text = "Done";
         }));
    });
}

コメントで述べたように、このメソッドが UI から呼び出された場合、タスクで非同期操作を実行するだけで済みます。await再開時に Dispatcher を探す必要はありませんawait。この場合は UI スレッドで再開されるためです。 . その例を次に示します。

public async void OnButtonClick_DoDbOperationsAsync()
{
    await Task.Run(() =>
    {
         // Your DB operations goes here
    });

    // You are now back at the UI thread and can update the UI..
}
于 2013-12-31T00:54:59.170 に答える