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

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日

悬赏问题

  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀