1

ビデオファイル(avi、mpegなど)を取得して別の形式に変換するアプリケーションを構築します。

私のアプリケーションにはファイルを追加するリストボックスがあり、ディレクトリを追加するオプションを追加したので、SafeFileEnumeratorクラスで(ここで見つけました)ディレクトリルートをチェックし、アクセス許可のあるフォルダーともちろんすべてのファイルのみを受け取り、追加したいよりもすべての関連ファイルをリスト ボックスに入れますが、mt 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();
    }
}
4

1 に答える 1

2

foreach をバックグラウンド ワーカー 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);
            }
        }
    }
};
于 2012-12-21T08:14:58.280 に答える