0

ファイルを再生するアプリケーションがあり、すべてのファイルには独自の実行時間があり、ファイルを自分のファイルに追加Listviewして再生ボタンをクリックするだけです。

これは、リストを入力として受け取った私の関数です。このリストにはすべてのファイルが含まれており、複数のファイルを同時に実行するオプションが必要なため、並列ファイルの数を制御できます。

public void doWork(IEnumerable<string> source, int parallelThreads )
{
    _tokenSource = new CancellationTokenSource();
    var token = _tokenSource.Token;
    Task.Factory.StartNew(() =>
    {
        try
        {
            Parallel.ForEach(source,
                new ParallelOptions
                {
                    MaxDegreeOfParallelism = parallelThreads //limit number of parallel threads 
                },
                file =>
                {
                    if (token.IsCancellationRequested)
                        return;
                    //do work...
                });
        }
        catch (Exception)
        { }

    }, _tokenSource.Token).ContinueWith(
            t =>
            {
                //finish...
            }
        , TaskScheduler.FromCurrentSynchronizationContext() //to ContinueWith (update UI) from UI thread
        );
} 

ファイルが終了すると、別のファイルの実行が開始され (複数のファイルを同時に再生することを選択した場合)、特定のファイルが終了したことを UI を更新したい場合、特定のファイルが終了したことをタスクからリアルタイムで知るにはどうすればよいですか?別のファイル開始?

4

1 に答える 1

0

私はコンパイラでこれをテストする立場になく、しばらく WinForms を行っていないため、ここにいくつかの小さな構文エラーがあるかもしれませんが、これは正しい方向に進むはずです:

... In your form code ...

ClassNameHere myOb = new ClassNameHere();
myOb.FileComplete += new FileCompleteHandler(FileDone);

...

public void FileDone(object sender, EventArgs e)
{
    if (InvokeRequired)
    {
        Invoke(new FileCompleteHandler(FileDone), new object[] { sender, e });
        return;
    }

    ... update UI here ...
}

次に、実際の作業を実行するクラスで (もちろん、必要に応じてクラスを呼び出すことができます)。

public delegate void FileCompleteHandler(object sender, EventArgs e)
public class ClassNameHere
{

    protected virtual void OnFileComplete()
    {
        FileCompleteHandler handler = FileComplete;
        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
    }

    public void doWork(IEnumerable<string> source, int parallelThreads )
    {
        _tokenSource = new CancellationTokenSource();
        var token = _tokenSource.Token;
        Task.Factory.StartNew(() =>
        {
            try
            {
                Parallel.ForEach(source,
                    new ParallelOptions
                    {
                        MaxDegreeOfParallelism = parallelThreads //limit number of parallel threads 
                    },
                    file =>
                    {
                        if (token.IsCancellationRequested)
                            return;
                        //do work...

                        // This is where we tell the UI to update itself.
                        OnFileComplete();
                    });
            }
            catch (Exception)
            { }

        }, _tokenSource.Token).ContinueWith(
                t =>
                {
                    //finish...
                }
            , TaskScheduler.FromCurrentSynchronizationContext() //to ContinueWith (update UI) from UI thread
            );
    } 

    public event FileCompleteHandler FileComplete;
}
于 2013-07-30T14:33:25.563 に答える