11

私は30〜80秒ごとに20〜50の新しいタスクを作成するプロジェクトに取り組んでいます。各タスクは10〜20秒間存続します。

したがって、タイマーを使用してこれらの新しいタスクを作成していますが、常に同じタスクを再作成するたびに、コードは次のようになります。

public class TaskRunner : IDisposable
{
    private readonly Timer timer;
    public IService service;

    public ThreadRunner(IService service) {
            this.service = service;
            timer = new Timer(10000);
            timer.Elapsed += Execute;
            timer.Enabled = true;
        }
    }

    private void Execute(object sender, ElapsedEventArgs e)
    {
        try
        {
            Task.Factory.StartNew(service.Execute);
        }
        catch (Exception ex)
        {
            logger.ErrorFormat("Erro running thread {0}. {1}", service, ex);
        }
    }

    public void Dispose()
    {
        timer.Dispose();
    }
}

私の質問は、タスクを作成して再起動し続ける方法があるので、新しいタスクを開始する必要はありませんTask.Factory.StartNew(service.Execute); 毎回?

それとも、それは私が心配する必要がないことであり、新しいタスクを作成し続けても大丈夫ですか?

この種のスレッドを使用して、このシナリオでどのように作業する必要があるかについてのガイド/ベストプラクティスはありますか?

4

3 に答える 3

8

Executeメソッドはすでにスレッドで実行されています。Elapsedイベントを発生させるために使用しているSystem.Timers.Timerによって開始されたスレッドプールスレッド。別のスレッドを開始するのではなく、渡されたスレッドを使用してください。スレッドプールスレッドは非常に安価で、自動的にリサイクルされます。

于 2010-09-12T20:54:27.357 に答える
7

改訂された質問へ:

毎回新しいタスクを作成する必要がありますか、それとも再起動するだけですか?

答えは非常に明確である必要があります。はい、毎回新しいものを使用してください。タスクを再利用しようとしないでください。使用は短いほど良いです。

スレッドの作成には非常に費用がかかりますが、タスクはすでにThreadPooolを使用してその問題に対処しています。邪魔しないでください。問題が発生するだけです。

于 2010-09-12T21:47:50.110 に答える
1

タイマーがトリガーされたときに各スレッドを再起動するのではなく、各スレッドに、指定されたコードを必要な頻度で実行するループを実行させてみませんか?

于 2010-09-12T20:56:06.797 に答える