在尝试进行 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 数据库。
最佳答案
一种简单的方法是将数据库操作包装在一个任务中:
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 调用此方法,您可以简单地在 Task 中执行异步操作,并且当
await
恢复时,无需寻找 Dispatcher,因为在这种情况下 await
正在恢复界面线程。这里给出了一个例子: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..
}
关于c# - 如何让 OleDb 代码异步运行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20849979/