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在表单启动被认为是不好的做法?如果是这样,我如何正确地从文本文件中读取,然后将其加载到组合,所以当表单加载时,它有必要的数据?

c#表单在启动时加载组合框项

不,这看起来很合法。你不必担心,因为这是WinForms中所有东西加载的方式…这将阻塞UI线程很短的时间,但由于你不打算加载大量的东西,你甚至不会注意到它。

当你开始执行大量的动作和大文件时,你应该考虑使用BackgroundWorkerTask !

无论如何,你也应该考虑使用以下代码来代替你的代码:

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;
}