Проблема кросс-нити - PullRequest
       1

Проблема кросс-нити

1 голос
/ 19 февраля 2011

Я получил этот код (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 ]

2 голосов
/ 19 февраля 2011

Заменить

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);
}
0 голосов
/ 19 февраля 2011
lg_log.Items.Add(args.Data);

Эта строка может выполняться в потоке, отличном от потока пользовательского интерфейса. Используйте this.BeginInvoke (...) для обновления пользовательского интерфейса в потоке пользовательского интерфейса.

Чтобы проверить выполнение на не-пользовательском интерфейсе, обратите внимание, что в сообщении InvalidOperation будет указан межпоточный доступ к пользовательскому интерфейсу

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

private void UpdateUI(string data)
{
    lg_log.Items.Add(data);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...