我有这个代码(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);代码行
答案 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);
}