交叉线程问题

时间:2011-02-19 15:10:01

标签: c# multithreading batch-file

我有这个代码(lg_log是一个列表框,我想让它记录start_server.bat)这是我得到的代码:

public void bt_play_Click(object sender, EventArgs e)
{
    lg_log.Items.Add("Starting Mineme server ..");

    string directory = Directory.GetCurrentDirectory();


    var info = new ProcessStartInfo(directory + @"\start_base.bat") {UseShellExecute = false, RedirectStandardOutput = true, CreateNoWindow = true, WorkingDirectory = directory + @"\Servers\Base"};
    var proc = new Process { StartInfo = info, EnableRaisingEvents = true };

    proc.OutputDataReceived += (obj, args) =>
    {
        if (args.Data != null)
        {
            lg_log.Items.Add(args.Data);
        }
    };
    proc.Start();
    proc.BeginOutputReadLine();

    lg_log.Items.Add("Server is now running!");
    proc.WaitForExit();
}

当我运行时,我会收到错误..

编辑:我得到的错误是这样的:System.InvalidOperationException希望它有帮助:)

错误来自lg_log.Items.Add(args.Data);代码行

2 个答案:

答案 0 :(得分:2)

替换

if (args.Data != null)
{
    lg_log.Items.Add(args.Data);
}

if (args.Data != null)
{
    if (lg_log.InvokeRequired)
        lg_log.Invoke(new Action(() => lg_log.Items.Add(args.Data)));
    else
        lg_log.Items.Add(args.Data);
}

答案 1 :(得分:0)

lg_log.Items.Add(args.Data);

此行可能在与UI线程不同的线程上执行。使用this.BeginInvoke(...)更新UI线程上的UI。

验证非UI htread上的执行情况,注意InvalidOperation的消息将声明对UI的跨线程访问

this.BeginInvoke(new Action<string>(UpdateUI(args.Data));
....

private void UpdateUI(string data)
{
    lg_log.Items.Add(data);
}