Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在处理InvokeRequest之前引发跨线程invalidOperationexception_C#_Multithreading_Textbox_Console.writeline - Fatal编程技术网

C# 在处理InvokeRequest之前引发跨线程invalidOperationexception

C# 在处理InvokeRequest之前引发跨线程invalidOperationexception,c#,multithreading,textbox,console.writeline,C#,Multithreading,Textbox,Console.writeline,我正在导入一个json文件,并通过Console.WriteLine将其内容显示到一个文本框中。我之所以使用多线程,是因为我想取消对其内容的写入,并且已经了解到在使用多线程时需要调用对文本框的写入,但我无法让它工作。当if(output.invokererequired)运行时,它抛出关于不安全的跨线程调用的错误,我不知道为什么 代码如下: public class TextBoxStreamWriter : TextWriter { TextBox _output = null; p

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

代码如下:

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();
}
以及负责事件处理程序的部分:

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

你需要做
\u输出。调用
而不是
这个。调用
,这样你就可以在正确的线程上调用了。

你需要显示你新创建的TextBoxStreamWriter的位置,还要尝试
\u输出。调用(
而不是
这个。调用(
@ScottChamberlain,我没有想过尝试
\u输出。调用(
它现在很有魅力。我把我的评论交给了一个答案。