0

これが単純な質問である場合は申し訳ありませんが、私は非常に疲れ果てており、まっすぐに考えています。最近、スレッドをセットアップしましたが、うまく機能しています。ユーザーは作業を実行するアイテムを選択し、選択したアイテムの数に応じて の配列を動的に作成し、Threadアイテムごとに 1 つのスレッドをディスパッチします。

ただし、あまりにも多くのファイルが選択されていると、ファイルが存在するサーバーが適切に再生されないことに気付きました。作業が必要な項目が 30 ある場合でも、一度に 5 つのアクティブなスレッドしか宣言できないという事実は知っていますが、それについて頭を悩ませることはできません。

PS:私が ThreadPool について説明している場合はお知らせください...私はそれを機能させようとしましたが、.NET のスレッド化の方法にはかなり新しいもので、かなりの時間と運がありませんでした。

現在の方法:

threadedResults = new List<string>[SelectedItems.Count];
List<string> results = new List<string>();
ThreadSettings tsArgs = (ThreadSettings)args;

for (int i = 0; i < SelectedItems.Count; i++)
{
    threadedResults[i] = new List<string>();
}

Thread[] threads = new Thread[SelectedItems.Count];

for (int i = 0; i < SelectedItems.Count; i++)
{
    KeyValuePair<int, ThreadSettings> threadArgs = new KeyValuePair<int, ThreadSettings>(i, (ThreadSettings)tsArgs);

    threads[i] = new Thread(new ParameterizedThreadStart(DoWork));
    threads[i].Start(threadArgs);
}
for (int i = 0; i < SelectedItems.Count; i++)
{
    if (CommandTask != null)
        threads[i].Join();
    else
    {
        // User Cancelled, abort all threads and break
        for (int j = 0; j < SelectedItems.Count; j++)
        {
            threads[j].Abort();
        }
        break;
    }
}

// Gather all results, format and return
4

2 に答える 2

2

基本的に、TPL で次のようなことを行います。

        // source for cancelling work
        var cxlSource = new CancellationTokenSource();

        // create and schedule tasks to start
        var tasks =
            Enumerable.Range(0, SelectedItems.Count)
                .Select(i => Task.Factory.StartNew(DoWork, yourStateInfo, cxlSource.Token))
                .ToArray();

        // then wait for the results
        Task.WaitAll(tasks);

いつでもタスクをキャンセルする必要がある場合は、キャンセルをリクエストできます。

            cxlSource.Cancel();

これにより、実行を待っているタスクが開始されなくなり、タスクはトークン自体を定期的に調べることができるため、進行中にキャンセルされた場合は早期に中止できます。

TPL の使用 (および一般的なスレッド化) には多くのニュアンスがありますが、それは大まかな考えです。

于 2012-06-06T16:02:09.927 に答える
1

バージョンに固執したい場合は、5 ではなく Environment.ProcessorCount スレッド数を宣言します (2 つのプロセッサがある場合、5 つのスレッドのうち 2 つだけが同時に実行されます)。スレッドが多すぎると、システムにオーバーヘッドが発生します (これが問題になる場合があります)。

そうでない場合は、.net 4 または TreadPool でタスクを使用することを検討してください。

于 2012-06-06T15:56:34.070 に答える