gpt4 book ai didi

c# - 是否可以始终调用而不是检查 InvokeRequired?

转载 作者:行者123 更新时间:2023-12-01 13:18:17 25 4
gpt4 key购买 nike

我知道您必须调用才能进行跨线程更新。但是,如果不需要 Invoke,您能否像需要 Invoke 时那样调用代码?

所以不是这个:

if(rtbSearchResults.InvokeRequired)
{
var ctuDelegate = new SearchResultsCrossThreadUpdate(SetSearchResultsRTB);
rtbSearchResults.Invoke(ctuDelegate, new object[] { resultString });
}
else
{
SetSearchResultsRTB(resultString);
}

我可以只这样做并接受性能损失吗?

var ctuDelegate = new SearchResultsCrossThreadUpdate(SetSearchResultsRTB);
rtbSearchResults.Invoke(ctuDelegate, new object[] { resultString });

最佳答案

一个有问题的情况是您想要访问尚无句柄的窗体上的控件。例如,如果您在创建的表单上调用一些初始化函数以在显示表单之前填充表单的控件。

在这种情况下,调用控件上的 Invoke 将抛出 InvalidOperationException

考虑这种形式:

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

public void Test()
{
Action a = () => { textBox1.Text = "A"; };
textBox1.Invoke(a);
}
}

这段代码调用了表单

Form1 form = new Form1();
form.Test();
form.ShowDialog();

这将导致异常,因为 Invoke 是在 TextBox 上调用的,而它还没有句柄。

包括对 InvokeRequired 的检查,不会有异常。

public void Test()
{
Action a = () => { textBox1.Text = "A"; };

if (textBox1.InvokeRequired)
{
textBox1.Invoke(a);
}
else
{
a();
}
}

关于c# - 是否可以始终调用而不是检查 InvokeRequired?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59650779/

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