C# 交叉线程操作无效:控件'';从创建它的线程以外的线程访问 private void MMScrpt() { 尝试 { MySqlConnectionStringBuilder connBuilder=new MySqlConnectionStringBuilder(); 添加(“数据库”,databaseMM); 添加(“数据源”、“本地主机”); 添加(“用户Id”、“根”); 添加(“密码”,txtPassword.Text); MySqlConnection=newmysqlconnection(connBuilder.ConnectionString); MySqlCommand cmd=connection.CreateCommand(); connection.Open(); progressBar1.最小值=0; progressBar1.步骤=1; progressBar1.值=0; 字符串MMScript=Properties.Resources.millmancompany; string[]tokens=MMScript.Split(“;”); progressBar1.Maximum=tokens.Length; for(int i=0;i

C# 交叉线程操作无效:控件'';从创建它的线程以外的线程访问 private void MMScrpt() { 尝试 { MySqlConnectionStringBuilder connBuilder=new MySqlConnectionStringBuilder(); 添加(“数据库”,databaseMM); 添加(“数据源”、“本地主机”); 添加(“用户Id”、“根”); 添加(“密码”,txtPassword.Text); MySqlConnection=newmysqlconnection(connBuilder.ConnectionString); MySqlCommand cmd=connection.CreateCommand(); connection.Open(); progressBar1.最小值=0; progressBar1.步骤=1; progressBar1.值=0; 字符串MMScript=Properties.Resources.millmancompany; string[]tokens=MMScript.Split(“;”); progressBar1.Maximum=tokens.Length; for(int i=0;i,c#,winforms,C#,Winforms,您无法访问线程上的UI控件。您应该使用调度程序或任务来更新UI组件 例如,添加对windowBase的引用,在启动线程之前保留对当前调度程序的引用,并使用它更新控件: private void MMScrpt() { try { MySqlConnectionStringBuilder connBuilder = new MySqlConnectionStringBuilder(); connBuilder.Add("Database", datab

您无法访问线程上的UI控件。您应该使用调度程序或任务来更新UI组件

例如,添加对windowBase的引用,在启动线程之前保留对当前调度程序的引用,并使用它更新控件:

private void MMScrpt()
{
    try
    {
       MySqlConnectionStringBuilder connBuilder = new MySqlConnectionStringBuilder();

       connBuilder.Add("Database", databaseMM);
       connBuilder.Add("Data Source", "localhost");
       connBuilder.Add("User Id", "root");
       connBuilder.Add("Password", txtPassword.Text);

       MySqlConnection connection = new MySqlConnection(connBuilder.ConnectionString);
       MySqlCommand cmd = connection.CreateCommand();

       connection.Open();
       progressBar1.Minimum = 0;
       progressBar1.Step = 1;
       progressBar1.Value = 0;

       string MMScript = Properties.Resources.millmancompany;
       string[] tokens = MMScript.Split(';');
       progressBar1.Maximum = tokens.Length;
       for (int i = 0; i < tokens.Length; i++)
       {
           MMtokens = tokens[i];
           cmd.CommandText = MMtokens.ToString();
           cmd.CommandType = CommandType.Text;
           cmd.ExecuteNonQuery();
           progressBar1.PerformStep();
       }
       connection.Close();
       connection.Close();
   }

   catch (Exception ex)
   {
       MessageBox.Show(ex.Message, "Error Message");
   }
}

private void BTNsriptRUN_Click(object sender, EventArgs e)
{

    Thread tr1 = new Thread(new ThreadStart(MMScrpt));

    tr1.Start();
    //MMScrpt();

}

可能的重复使用async/await的引入,您可以轻松地重写代码,而无需显式创建任何线程。因此,如果可能的话,花一些时间在这上面,节省你自己的时间。
//Reference to CurrentDispatcher before launching thread:

Dispatcher myDispatcher = Dispatcher.CurrentDispatcher;

myDispatcher.BeginInvoke(new Action(() =>
{
 progressBar1.Minimum = 0;
 progressBar1.Step = 1;
 progressBar1.Value = 0;

 }));