gpt4 book ai didi

c# - 从不同类中的不同线程更新 UI

转载 作者:行者123 更新时间:2023-11-30 21:09:32 25 4
gpt4 key购买 nike

我有一个主窗体类,其中包含一个我想更改的列表框。该框填充了以耗时方法创建的项目。现在它看起来像这样(手工发明一个例子,可能不是有效的 C#):

List<string> strings = StaticClassHelper.GetStrings(inputString);
foreach(string s in strings)
{
listBox1.Add(s);
}

//meanwhile, in a different class, in a different file...

public static List<string> GetStrings(inputString)
{
List<string> result = new List<string>();
foreach(string s in inputString.Split('c'))
{
result.Add(s.Reverse());
Thread.Sleep(1000);
}
return result;
}

我想做的是在发现新字符串时定期更新列表框。当线程方法在同一个类中时,我发现的其他答案有效,因此您可以设置事件处理程序。我在这里做什么?

最佳答案

我喜欢这样做,我在表单上创建了一个方法,如下所示:

public void AddItemToList(string Item)
{
if(InvokeRequired)
Invoke(new Action<string>(AddItemToList), Item);
else
listBox1.Add(Item);
}

在这种情况下,我更喜欢调用以确保同步添加项目,否则它们可能会乱序。如果您不关心顺序,那么您可以使用 BeginInvoke,这会更快一些。由于此方法是公共(public)的,因此只要您可以获得对表单的引用,您就可以从应用程序中的任何类中使用它。

这样做的另一个优点是您可以从 UI 线程或非 UI 线程调用它,它负责决定是否需要 Invokeing。这样您的调用者就不需要知道他们在哪个线程上运行。

更新为了解决您关于如何获取对 Form 的引用的评论,通常在 Windows Forms 应用程序中,您的 Program.cs 文件看起来像这样:

static class Program
{
static void Main()
{
MyForm form = new MyForm();
Application.Run(form);
}

}

这是我通常会做的,特别是在“单一表格”申请的情况下:

static class Program
{
public static MyForm MainWindow;

static void Main()
{
mainWindow = new MyForm();
Application.Run(form);
}

}

然后您几乎可以在任何地方访问它:

Program.MainWindow.AddToList(...);

关于c# - 从不同类中的不同线程更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9009681/

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