Я пытаюсь реализовать асинхронные методы в своей программе и хочу асинхронно читать каждую строку из таблицы данных. У меня такая ситуация:
private void VerifyPermissions()
{
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)
{
VerifyPermissions()
}
Кто-нибудь может показать мне асинхронную ситуацию для этого? Спасибо.
В части foreach я должен добавить элементы управления в схему потока. Если оператор select большой, он на некоторое время замораживает пользовательский интерфейс. Я хочу обойти это замирание ...
Все элементы управления должны быть добавлены в поток пользовательского интерфейса, и асинхронное добавление их в пользовательский интерфейс не имеет смысла. Если ваша проблема заключается в зависании пользовательского интерфейса из-за открытия соединения и загрузки данных, вы можете загружать данные в таблицу данных асинхронно.





Что ж, вы можете сделать это в основном, создавая задачи на 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);
}
}
Привет, Бруно, спасибо за ответ. В этом коде Ive tried to add controls to a flowlayout panel in ProcessItem method but it returns exceptions in Output. Ive пробовал следующее: UserTag ut = new UserTag (); flowLayoutPanel2.Controls.Add (ut);
Для этого вы должны вызвать действие. Вызов метода означает, что фрагмент кода будет выполняться в основном потоке вашей программы, а затем вы можете выполнять действия с пользовательским интерфейсом.
согласно вашему комментарию вам понадобится что-то вроде моего кода ниже. Если вы используете SqlCommand вместо SqlDataAdapter, у вас уже будут асинхронные методы, и вам не нужно создавать задачу.
(также не смешивайте пользовательский интерфейс и доступ к данным. Держите их отдельно.)
private async void button1_Click(object sender, EventArgs e)
{
await VerificarPermissoes();
}
private async Task VerificarPermissoes()
{
await Task.Run(() =>
{
// put your code from above here.
});
}
Почему вы хотите использовать асинхронный режим?