gpt4 book ai didi

c# - WinForms 线程间修改

转载 作者:太空狗 更新时间:2023-10-29 23:48:24 25 4
gpt4 key购买 nike

每当我想从另一个线程修改一个winform时,我需要使用

->调用(委托(delegate),参数)

这样修改就发生在winform自己的线程中。

对于每个需要修改 gui 的函数,我都需要另一个委托(delegate)函数。

是否有一些方案允许我限制所需委托(delegate)函数的数量?我有一个 Controller 类,它在一个地方处理整个图形用户界面,我考虑过重用委托(delegate),但味道很难闻。

我认为我的问题可以适用于所有可以运行winform的语言

最佳答案

如果您使用的是 C# 3,则可以使用 lambda,而在 C# 2 中,则使用匿名委托(delegate)。当不需要重用行为时,这些简化了语法。我经常做的一件事是在表单代码中而不是在 Controller 中进行同步。 Controller 不应该被这些“管道”问题所困扰,这些问题对技术而言比对 Controller 逻辑更具体。

public void ResetFields()
{
// use "delegate" instead of "() =>" if .Net version < 3.5
InvokeOnFormThread(() =>
{
firstInput.Text = Defaults.FirstInput;
secondInput.Text = Defaults.SecondInput;
thirdChoice.SelectedIndex = Defaults.ThirdChoice;
});
}

// change Action to MethodInvoker for .Net versions less than 3.5
private void InvokeOnFormThread(Action behavior)
{
if (IsHandleCreated && InvokeRequired)
{
Invoke(behavior);
}
else
{
behavior();
}
}

作为一种实践,让表单中的所有公共(public)方法都调用“InvokeOnFormThread”。或者,您可以使用 AOP 来拦截表单上的公共(public)方法调用并调用“InvokeOnFormThread”,但上面的方法已经足够好了(如果您始终如一并记住始终对表单或用户控件上的公共(public)方法执行此操作)。

关于c# - WinForms 线程间修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1110458/

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