我正在尝试在程序中实现异步方法,并且想从数据表中异步读取每一行。 我有以下情况:
private void VerificarPermissoes()
{
try
{
string constring = String.Format("server={0}; user id={1}; password={2}; database={3}; pooling=false", AcessoBancoDados.server, AcessoBancoDados.user, AcessoBancoDados.password, AcessoBancoDados.database);
MySqlConnection con = new MySqlConnection();
con.ConnectionString = constring;
con.Open();
var query = "SELECT id FROM users";
MySqlCommand cmd = new MySqlCommand(query, con);
MySqlDataAdapter da = new MySqlDataAdapter(query, con);
DataTable dt = new DataTable();
da.Fill(dt);
con.Close();
foreach (DataRow item in dt.Rows)
{
Messagebox.Show(item["id"].ToString());
}
}
调用方法:
private void button1_Click(object sender, EventArgs e)
{
VerificarPermissoes()
}
有人可以为此显示一个异步情况吗?谢谢。
答案 0 :(得分:0)
好吧,基本上可以通过在c#中创建任务来做到这一点,请参见下面的示例
private void VerificarPermissoes()
{
try
{
DataTable dt = new DataTable();
string constring = String.Format("");
string query = "SELECT id FROM users";
using (SqlConnection con = new SqlConnection(constring))
{
con.Open();
DbCommand command = con.CreateCommand();
command.CommandText = query;
dt.Load(command.ExecuteReader());
}
foreach (DataRow item in dt.Rows)
{
Task.Factory.StartNew(delegate () { ProcessItem(item["id"].ToString()); });
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void ProcessItem(string item)
{
AddControl(myControl, childControl);
}
private void button1_Click(object sender, EventArgs e)
{
VerificarPermissoes();
}
private void AddControl(Control ctrl, Control child)
{
if (ctrl.InvokeRequired)
{
Action act = delegate () { AddControl(ctrl, child); };
this.Invoke(act);
}
else
{
ctrl.Controls.Add(child);
}
}
答案 1 :(得分:0)
根据您的评论,您将需要以下类似我的代码的内容。 如果您使用SqlCommand而不是SqlDataAdapter,则您将已经具有异步方法,无需创建任务。
(也不要将ui和数据访问混合使用。请将它们分开。)
private async void button1_Click(object sender, EventArgs e)
{
await VerificarPermissoes();
}
private async Task VerificarPermissoes()
{
await Task.Run(() =>
{
// put your code from above here.
});
}