用不同的线程在列表框中插入多个文件

本文关键字:插入 文件 列表 线程 | 更新日期: 2023-09-27 17:49:21

a构建一个应用程序,可以将视频文件(avi, mpeg..)转换为另一种格式。

我的应用程序列表框添加文件到我添加选项添加目录与SafeFileEnumerator类(在这里我找到了)我检查目录根,只收到文件夹权限和当然比我想的所有文件和所有相关的文件添加到列表框,但我想如果线程为了避免太GUI冻结,所以我尝试使用BackgroundWorker,我认为我需要一些帮助来完成它,因为对于我来说它不正常工作:

private void btnAddDirettory_Click_1(object sender, EventArgs e)
{
    string fileToAdd = string.Empty;
    BackgroundWorker backgroundWorker = null;
    DialogResult dialog = folderBrowserDialog1.ShowDialog();
    if (dialog == DialogResult.OK)
    {
        btnAddfiles.Enabled = false;
        btnAddDir.Enabled = false;
        btnPlay.Enabled = false;
        someClass myClass= new someClass ();
        foreach (string fileName in SafeFileEnumerator.EnumerateFiles(folderBrowserDialog1.SelectedPath, "*.*", SearchOption.AllDirectories))
        {
            backgroundWorker = new BackgroundWorker();
            backgroundWorker.WorkerReportsProgress = true;
            backgroundWorker.DoWork +=
            (s1, e1) =>
            {
                if (myClass.iAviFormat(fileName))
                {
                    if (myClass.isCorrectFormat(fileName))
                    {
                        backgroundWorker.ReportProgress(0, fileName);
                        //listBoxFiles.Items.Add(fileName);
                    }
                    else if (!myClass.isCorrectFormat(fileName))
                    {
                        fileToAdd = myClass.getNewFileName(fileName);
                        backgroundWorker.ReportProgress(0, fileToAdd);
                    }
                }
            };
        }
        backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
        (s1, e1) =>
        {
            btnPlay.Enabled = true;
            btnClear.Enabled = true;
            btnAddfiles.Enabled = true;
            btnAddDir.Enabled = true;
        });
        backgroundWorker.ProgressChanged +=
         (s1, arguments) =>
         {
             listBoxFiles.Items.Add(arguments.UserState);
         };
        backgroundWorker.RunWorkerAsync();
    }
}

用不同的线程在列表框中插入多个文件

我认为你应该把foreach移到后台worker DoWork中。

之类的
backgroundWorker = new BackgroundWorker();
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.DoWork +=
(s1, e1) =>
{
    string fileToAdd = string.Empty;
    someClass myClass= new someClass ();
    foreach (string fileName in SafeFileEnumerator.EnumerateFiles(folderBrowserDialog1.SelectedPath, "*.*", SearchOption.AllDirectories))
    {
        if (myClass.iAviFormat(fileName))
        {
            if (myClass.isCorrectFormat(fileName))
            {
                backgroundWorker.ReportProgress(0, fileName);
                //listBoxFiles.Items.Add(fileName);
            }
            else if (!myClass.isCorrectFormat(fileName))
            {
                fileToAdd = myClass.getNewFileName(fileName);
                backgroundWorker.ReportProgress(0, fileToAdd);
            }
        }
    }
};