【发布时间】:2021-08-27 09:18:28
【问题描述】:
每次我创建一个新的Thread 并存储该值时,如何增加一个变量?我想在每个线程中为不同的数据库做 mysqlbackup,我会在 Class1.cs 上完成 curBytes/totalBytes。我想将该值更新为datagridview.Row[iterate].Cell[2] 在线程之间同时进行,其中迭代对应于第一个线程的值 0,第二个线程的值 1,依此类推。
我尝试过使用Interlocked.Increment 和lock(),但它们似乎不起作用。我不想使用BackgroundWorker。
这是我没有做任何更改的代码datagridIterate(遍历datagridview Rows的值)
Form.cs:
private void button1_Click(object sender, EventArgs e)
{
restoreUI();
}
public void restoreUI()
{
mysqlUtils msu = new mysqlUtils();
foreach(DataGridViewRow row in dataGridView1.Rows)
{
Thread t = new Thread(() =>
{
msu.Restore(row.Cells[1].Value?.ToString(), server.Text, username.Text,
pwd.Text, row.Cells[0].Value?.ToString());
}
t.Start();
}
}
Class1.cs:
namespace Utils
{
public class mysqlUtils
{
public int total;
public int cur;
public void Restore(string filename, string server, string user,
string password, string db)
{
string constring = "server=" + server + ";user=" + user +
";pwd=" + password + ";database=" + db + ";";
string file = "C:\\Users\\SQL FILES\\" + filename;
using (MySqlConnection conn = new MySqlConnection(constring))
{
using (MySqlCommand cmd = new MySqlCommand())
{
using (MySqlBackup mb = new MySqlBackup(cmd))
{
cmd.Connection = conn;
conn.Open();
mb.ImportInfo.IntervalForProgressReport = 50;
mb.ImportProgressChanged += updateProgress;
mb.ImportFromFile(file);
conn.Close();
}
}
}
}
}
public void updateProgress(object sender, ImportProgressArgs e)
{
total = (int)e.TotalBytes;
cur = (int)e.CurrentBytes;
Form4 form4 = (Form4)Application.OpenForms[0];
form4.updateProgressValue(total, cur);
}
}
我应该如何设法更改datagridIterate,它的值i 用于第一个线程,i+1 用于下一个线程等等?如果您有任何支持,我将不胜感激。
【问题讨论】:
-
我将假设对
msu.Restore的调用非常耗时。但似乎它可能正在对数据网格做一些事情 - 但是线程中不允许这样做。我们真的需要看到完整的代码。 -
我现在编辑一下,需要几分钟时间
-
您无法在非 UI 线程中访问任何 UI 元素。所有参数
row.Cells[1].Value?.ToString(), server.Text, username.Text, pwd.Text, row.Cells[0].Value?.ToString()在线程内部都无法访问。 -
在
mysqlUtils类中调用Form4 form4 = (Form4)Application.OpenForms[0];是一个糟糕的设计,因为它会创建从 DB 到 UI 的强耦合。这通常非常糟糕。
标签: c# multithreading winforms mysql-backup