gpt4 book ai didi

.net 多线程

转载 作者:行者123 更新时间:2023-12-03 13:18:04 26 4
gpt4 key购买 nike

我为文本框控件编写了扩展类。

public static class Extensions
{
public static void AddMessage(this System.Windows.Forms.TextBox textbox,string message){
textbox.AppendText(DateTime.Now.ToString() + " " + message + "\r\n");
}
}

我的文本框控件,通过构造函数从表单传递给“核心”类,例如:
public static TextBox text;
public Core(TextBox text)
{
Core.text = text;
}

这是事件:
...{
change.DataChanged += new Opc.Da.DataChangedEventHandler(OnDataChange);
}...

打回来:
public void OnDataChange(object subscriptionHandle, object requestHandle, Opc.Da.ItemValueResult[] values)
{
Send(values,configuration.service.adress);
}

public static void Send(Opc.Da.ItemValueResult[] values,string addr) {
text.AddMessage("test"); //here comes exception
}

在 text.AddMessage(...) 我有:“Microsoft.VisualStudio.Debugger.Runtime.CrossThreadMessagingException”

编辑:
我认为我的问题不在 Add.Message 函数中,导致文本框已经出现扩展,但我错过了什么?所以我想我什至不能从“发送”功能中调用“文本”

编辑:“文本”的异常(exception)来自
change.DataChanged += new Opc.Da.DataChangedEventHandler(OnDataChange);

最佳答案

您不能从负责相关控件的线程以外的线程访问或更改 UI 内容。

您可以使用 Control.Invoke / BeginInvoke 对于 Windows 窗体或 Dispatcher.BeginInvoke 用于 WPF/Silverlight 将委托(delegate)调用编码到正确的线程。或者, BackgroundWorker 也可以让你的生活更轻松。

例如,您的扩展类可以更改为:

public static class Extensions  
{
public static void AddMessage(this TextBox textbox, string message) {
Action action = () => {
textbox.AppendText(DateTime.Now.ToString() + " " + message + "\r\n");
};
textBox.BeginInvoke(action);
}
}

关于.net 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4253683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com