c#表单在启动时加载组合框项
本文关键字:组合 加载 表单 启动 | 更新日期: 2023-09-27 17:54:23
public Form1()
{
InitializeComponent();
loadComboEmail();
}
private void loadComboEmail()
{
string path = Directory.GetCurrentDirectory();
string build = (path + "''" + "email.txt");
string[] lines = System.IO.File.ReadAllLines(build);
comboEmail.Items.AddRange(lines);
comboEmail.SelectedIndex=0;
}
我有一个组合框,我想加载的客户端电子邮件地址存储在一个文本文件。使用loadComboEmail()
,我从文本文件中读取并加载Combobox
。我做的事情是通过调用loadComboEmail
在表单启动被认为是不好的做法?如果是这样,我如何正确地从文本文件中读取,然后将其加载到组合,所以当表单加载时,它有必要的数据?
不,这看起来很合法。你不必担心,因为这是WinForms
中所有东西加载的方式…这将阻塞UI
线程很短的时间,但由于你不打算加载大量的东西,你甚至不会注意到它。
当你开始执行大量的动作和大文件时,你应该考虑使用BackgroundWorker
或Task
!
无论如何,你也应该考虑使用以下代码来代替你的代码:
private void loadComboEmail()
{
string path = System.IO.Path.GetDirectoryName(Application.ExecutablePath); //seems to be the same to me, but is safer
string build = System.IO.Path.Combine(path, "email.txt"); //much more safer then simple string addition
string[] lines = System.IO.File.ReadAllLines(build);
comboEmail.Items.AddRange(lines);
comboEmail.SelectedIndex = 0;
}
您可以使用:
Task task = Task.Factory.StartNew(() =>
{
// Background work
loadComboEmail();
}).ContinueWith((t) =>
{
//If you need to execute something after the loading process.
});
为了更新UI线程,你可以在另一个线程上进行读取,当邮件列表加载时,只需更新它。
Task.Factory.StartNew(() =>
{
// Background work - read the file
}).ContinueWith((t) => {
// Update UI thread here
}, TaskScheduler.FromCurrentSynchronizationContext());
使用构造函数来加载它并不被认为是一种不好的做法。请阅读Hans Passant关于何时应该使用窗口的Load事件的回答。什么设置代码应该去表单构造器与表单加载事件?
尽管在评论中说,你正在阻塞UI线程。在构造函数中不能使用关键字await。所以你必须"炒了就忘了"。当使用Load
事件时,您可以使用await
,但事件处理程序是async void
。所以他们没有等待,你仍然有"火和忘记"。
public Form1()
{
InitializeComponent();
loadComboEmail();
}
private async Task loadComboEmail()
{
string path = Directory.GetCurrentDirectory();
string build = (path + "''" + "email.txt");
string[] lines = await Task.Run(() => File.ReadAllLines(build));
comboEmail.Items.AddRange(lines);
comboEmail.SelectedIndex=0;
}