【问题标题】:Cross-thread invalidOperationexception is thrown before invokeRequired is handled在处理invokeRequired之前抛出跨线程invalidOperationexception
【发布时间】:2017-03-06 15:50:06
【问题描述】:

我正在导入一个 json 文件并通过Console.WriteLine 将其内容显示到一个文本框。我使用了多线程,因为我想取消其内容的写入,并且已经阅读了在使用多线程时需要调用对文本框的写入,但我无法让它工作。当if(output.InvokeRequired) 运行时,它会抛出有关不安全的跨线程调用的错误,我不知道为什么。

代码如下:

public class TextBoxStreamWriter : TextWriter
{
  TextBox _output = null;

  public TextBoxStreamWriter(TextBox output)
  {
      _output = output;
  }

  public override void Write(char value)
  {
      base.Write(value);
      if (_output.InvokeRequired)
      {
          this.Invoke((MethodInvoker)(() => _output.AppendText(value.ToString())));
      }
  }

  public override Encoding Encoding
  {
      get { return System.Text.Encoding.UTF8; }
  }
}

以及负责事件处理程序的部分:

private void goButton_Click(object sender, EventArgs e)
{
    _worker = new BackgroundWorker();
    _worker.WorkerSupportsCancellation = true;

    _worker.DoWork += new DoWorkEventHandler((state, args) =>
    {
        do
        {
           if (_worker.CancellationPending) break;

           Console.WriteLine("Hello, world");

        } while (true);
    });

    _worker.RunWorkerAsync();
    goButton.Enabled = false;
    stopButton.Enabled = true;
}

private void stopButton_Click(object sender, EventArgs e)
{
   stopButton.Enabled = false;
   goButton.Enabled = true;
   _worker.CancelAsync();
}

【问题讨论】:

  • 你需要显示你在哪里新建了TextBoxStreamWriter,也可以试试_output.Invoke(而不是this.Invoke(
  • @ScottChamberlain,我没想过要尝试_output.Invoke(,它现在就像一个魅力。
  • 我把我的评论变成了答案。

标签: c# multithreading textbox console.writeline


【解决方案1】:

您需要使用_output.Invoke 而不是this.Invoke,以便在正确的线程上调用。

【讨论】:

    猜你喜欢
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 2015-08-27
    • 1970-01-01
    相关资源
    最近更新 更多