C# 交叉线程问题

C# 交叉线程问题,c#,multithreading,batch-file,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 ProcessSta

我得到了这段代码(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)中;代码行

lg_log.Items.Add(args.Data);
此行可能在与UI线程不同的线程上执行。使用此.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);
}
this.BeginInvoke(新操作(UpdateUI(args.Data));
....
私有void UpdateUI(字符串数据)
{
lg_日志项添加(数据);
}
更换

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


你能提供你得到的错误吗?请提供完整的异常。说“InvalidOperationException”是无用的信息。对不起:)我解决了这个问题-谢谢你的帮助!抱歉-我将在新操作(()代码)处出错。也许我需要编写一个使用系统。什么?@Frederik您不需要新操作,()=>lg_log.Items.Add(args.Data)应该足够了。除非您使用2.0:-):-)@Frederik,它在系统名称空间中,但在.NET 3或4或类似的内容中引入。您可以自己声明它
public delegate void Action()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);
}