wild84 2020-02-25 14:03 采纳率: 80%
浏览 609
已采纳

C# 跨執行緒作業無效: 存取控制項 'tb_log' 時所使用的執行緒與建立控制項的執行緒不同。

我的代碼執行時出現

跨執行緒作業無效: 存取控制項 'tb_log' 時所使用的執行緒與建立控制項的執行緒不同。

請幫我看下代碼哪裡出問題?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MavenInstall
{
    public partial class MavenInstall : Form
    {

        public MavenInstall()
        {
            InitializeComponent();

            tb_packaging.Text = "jar";
            //tb_command.Text = "mvn install:install-file -DgroupId={0} -DartifactId={1} -Dversion={2} -Dpackaging={3} -Dfile={4}";
        }

        private void btn_select_Click(object sender, EventArgs e)
        {
            if (SelectJarFile.ShowDialog() == DialogResult.OK)
            {
                tb_file.Text = SelectJarFile.FileName;
            }
        }

        private void btn_execute_Click(object sender, EventArgs e)
        {
            tb_log.Text = null;
            foreach (Control control in gb_condition.Controls)
            {
                control.Enabled = false;
            }
            String cmd = String.Format(@"mvn install:install-file -DgroupId={0} -DartifactId={1} -Dversion={2} -Dpackaging={3} -Dfile={4}"
                , tb_groupid.Text,tb_artifactid.Text
                ,tb_version.Text,tb_packaging.Text,tb_file.Text);
            tb_command.Text = cmd;
            Process process = new Process();
            process.StartInfo.FileName = "cmd.exe";
            process.StartInfo.UseShellExecute = false;    //是否使用操作系统shell启动
            process.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息
            process.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息
            process.StartInfo.RedirectStandardError = true;//重定向标准错误输出
            process.StartInfo.CreateNoWindow = true;//不显示程序窗口
            process.Start();//启动程序

            process.OutputDataReceived += new DataReceivedEventHandler(UpdateLog);
            process.BeginOutputReadLine();
            process.StandardInput.WriteLine(cmd);
            process.StandardInput.AutoFlush = true;
            process.StandardInput.WriteLine("exit");

            process.WaitForExit();//等待程序执行完退出进程
            foreach (Control control in gb_condition.Controls)
            {
                control.Enabled = true;
            }
            process.Close();
        }

        private void UpdateLog(object sender, DataReceivedEventArgs e)
        {
            this.tb_log.Text += e.Data;
        }

        private void btn_clear_Click(object sender, EventArgs e)
        {
            tb_groupid.Text = null;
            tb_artifactid.Text = null;
            tb_version.Text = null;
            tb_packaging.Text = null;
            tb_file.Text = null;
            tb_command.Text = null;
            tb_log.Text = null;
        }
    }
}


  • 写回答

2条回答 默认 最新

  • badboy_ankai 2020-02-25 14:57
    关注

    线程问题,UpdateLog函数是子线程,不能直接操作UI线程中的db_log对象。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已采纳回答 11月17日

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况