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
来做一些被认为是不好的做法?如果是这样,我如何正确读取文本文件,然后将其加载到组合中,所以当表单加载时,它有必要的数据?
答案 0 :(得分:2)
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;
}
答案 1 :(得分: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());
答案 2 :(得分:0)
使用构造函数加载不被视为不良做法。阅读Hans Passant的答案,了解何时应该使用窗口的加载事件。 What setup code should go in Form Constructors versus Form Load event?
Altough正如评论中所说,你正在阻止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;
}