【发布时间】:2023-03-30 10:43:01
【问题描述】:
我不是一个真正优秀的 C# 程序员。我习惯了 C 但不习惯 C#。
我知道从 UI 线程以外的线程我们无法更改文本框和标签的属性。
所以在尝试了几种不同的方法后,我一直在使用这种方法:
item.Invoke(new EventHandler(delegate
{
item.Text = text;
}));
然后在写了一些代码之后,我发现每次都这样做很无聊而且效率低下,所以我做了一个方法:
static void change_text_from_different_thread(TextBox item, string text)
{
item.Invoke(new EventHandler(delegate
{
item.Text = text;
}));
}
然后我尝试在我的线程中使用它,问题是我无法从线程发送 TextBox。
假设这是我的主题:
{
change_text_from_different_thread(textbox1,"Hi");
}
然后我得到这个错误:
非静态字段、方法或 属性
那么你能告诉我如何传递文本框吗? 顺便说一句,我的调用方法有可能是错误的或非常危险的,但我找不到更简单的方法。如果真的很糟糕,请告诉我。如果没问题,也请告诉我。如果通过使用其他方法,事情变得更好更容易,也请告诉我。
这是我第一次提问,如果我错过了一些东西,请见谅。 非常感谢。
这是我的方法:
static void gyro_self_check_thread_function()
{
//lab lab
}
这就是我创建线程并启动它的方式:
private void Gyro_self_check_button_Click(object sender, EventArgs e)
{
Gyro_self_check_status_label.Text = "Status: Checking....";
gyro_self_testing_groupBox.Update();
_serialPort.Write(Protocal_Values.gyro_self_checking_request, 0, 2);
Thread gyro_self_check_thread = new Thread(gyro_self_check_thread_function);
gyro_self_check_thread.Start();
//Thread gyro_self_check_thread = new Thread(gyro_self_check_thread);
//gyro_self_check_thread.Start();
}
【问题讨论】:
-
从工作线程更新 UI 通常是一种非常值得怀疑的做法。请参阅 BackgroundWorker.RunWorkerCompleted、TaskScheduler.FromCurrentSynchronizationContext 和 C# 5 async/await 关键字以了解替代方案。确保你不做一些你不应该做的容易做的事情。应该会痛的。
-
补充汉斯所说的,这里的想法是将您的用户界面逻辑与您的业务逻辑分开。从这个问题的声音来看,您正试图将两者紧密结合在一起。不要。
-
如果结果来自另一个线程,您将如何更改文本框文本?
-
我读到了这个dotnetperls.com/progressbar,我有了一个想法。但是如果我对我的所有代码都这样做,我有很多小线程,它会更长。我读到了这个 TaskScheduler.FromCurrentSynchronizationContext 但我什么都不懂。我有时间限制,所以现在,我将只使用调用。但我想知道是否有办法将一些任务传递给 UI 线程,以便在下次处理时处理它们。当我读到这个“TaskScheduler.FromCurrentSynchronizationContext”时,我想到了这个想法。
-
任何人都可以提供一个包含TaskScheduler.FromCurrentSynchronizationContext 的教程的建议吗?
标签: c# multithreading invoke