invokeRequired处理前抛出跨线程invalidOperationexception
Cross-thread invalidOperationexception is thrown before invokeRequired is handled
我正在导入 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();
}
您需要执行 _output.Invoke
而不是 this.Invoke
以便您在正确的线程上调用。
我正在导入 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();
}
您需要执行 _output.Invoke
而不是 this.Invoke
以便您在正确的线程上调用。