【问题标题】:Cross Thread problem跨线程问题
【发布时间】:2011-02-19 15:10:01
【问题描述】:

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

【问题讨论】:

  • 你能提供你得到的错误吗?
  • 请完整的例外。说“InvalidOperationException”是无用的信息。
  • 对不起 :) 我解决了这个问题 - 谢谢你帮了我很多忙!

标签: c# multithreading batch-file


【解决方案1】:

替换

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);
}

【讨论】:

  • 抱歉 - 我会在新的 Action(() 代码中遇到错误。也许我需要编写一个 Using system.Something?
  • @Frederik 你不需要新的Action,() => lg_log.Items.Add(args.Data) 应该足够了。
  • 除非您使用的是 2.0 :-) :-)
  • @Frederik,它在 System 命名空间中,但在 .NET 3 或 4 或类似的东西中引入。你可以自己声明public delegate void Action();
  • 非常感谢你们!我的问题现在已经解决了,谢谢!
【解决方案2】:
lg_log.Items.Add(args.Data);

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多