如何使 OleDb 代码异步运行



我在尝试进行Web下载/读取时看到了很多异步示例。但是我找不到 OleDb 的样本或任何内容(或者有更好的等价物吗?),我想使用 C# 5.0 的新简化的异步和等待功能。

这只是我现在如何使用 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 数据库。

一个简单的方法是将数据库操作包装在任务中:

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恢复时,无需查找调度程序,因为在这种情况下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..
}

相关内容

  • 没有找到相关文章

最新更新