gpt4 book ai didi

c# - C#.NET 中的线程和跨线程,如何从另一个线程更改 ComboBox 数据?

转载 作者:太空宇宙 更新时间:2023-11-03 17:57:58 25 4
gpt4 key购买 nike

我需要在我的应用程序中使用线程,但我不知道如何执行跨线程操作。

我希望能够从另一个线程更改表单对象(在本例中为组合框)的文本,但出现错误:

Cross-thread operation not valid: Control 'titlescomboBox' accessed from a thread other than the thread it was created on.

我真的不明白如何使用 invoke 和 begin invoke 函数,所以我真的在寻找一个非常简单的例子和​​解释,这样我就可以了解它。

此外,任何初学者教程都很棒,我找到了一些,但它们是如此不同,我不明白我需要做什么才能执行跨线程操作。

代码如下:

    // Main Thread. On click of the refresh button
private void refreshButton_Click(object sender, EventArgs e)
{
titlescomboBox.Items.Clear();
Thread t1 = new Thread(updateCombo);
t1.Start();
}

// This function updates the combo box with the rssData
private void updateCombo()
{
rssData = getRssData(channelTextBox.Text); // Getting the Data
for (int i = 0; i < rssData.GetLength(0); i++) // Output it
{

if (rssData[i, 0] != null)
{

// Cross-thread operation not valid: Control 'titlescomboBox'
// accessed from a thread other than the thread it was created on.

titlescomboBox.Items.Add(rssData[i, 0]); // Here I get an Error

}
titlescomboBox.SelectedIndex = 0;
}
}

最佳答案

我使用以下辅助类:

public static class ControlExtensions
{
public static void Invoke(this Control control, Action action)
{
if (control.InvokeRequired)
{
control.Invoke(new MethodInvoker(action), null);
}
else
{
action.Invoke();
}
}
}

现在您可以调用类似 MyCombo.Invoke(() => { MyCombo.Items.Add(something); }) --- 或之前的任何其他控件(例如表单)调用,因为它们都是在主线程上创建的。

问题是控件只能从创建它们的线程(在本例中为主应用程序线程)访问。

HTH

关于c# - C#.NET 中的线程和跨线程,如何从另一个线程更改 ComboBox 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6556330/

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