C# 交叉线程问题
我得到了这段代码(lg_log是一个列表框,我想让它记录start_server.bat)这是我得到的代码: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
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);
}