私はタイマーによって起動し、毎分時間がかかるWindowsサービスを書いています。いいえ。どのように私がそれを行うことができますか?何か案が?Windowsサービスのインスタンスの数
EDITED:いいえ。タイマーによって開始されたスレッドの数。
私はタイマーによって起動し、毎分時間がかかるWindowsサービスを書いています。いいえ。どのように私がそれを行うことができますか?何か案が?Windowsサービスのインスタンスの数
EDITED:いいえ。タイマーによって開始されたスレッドの数。
これは非常に貧しいデザインのように聞こえる - とメモリ/ CPUの豚。私はあなたが100のWindowsサービスを言うときに何を意味するのか分かりません。サービスは1つのサービスです。ユニークなサービスを提供するという意味で少なくとも。タスクマネージャを使用してバックグラウンドで隠された100のアプリケーションを起動していますか?そうであれば、実際のWindowsサービスを作成し、そのサービス内でアプリケーションのフロー(および実行中のコードの複数のインスタンスの実行)を制御するロジックを持つことで、これをもっとうまく行うことができます。
例えば、nのためにスリープする1つのメインスレッドを持つWindowsサービスを持つことができます。秒後に実行します。メインスレッドが起動すると、新しいスレッドを回転させる役割を果たします。たとえば、アクティブなスレッドの数を制御できるのに対し、スレッドプールを使用できます。メインスレッドはスレッドプールをチェックして、スレッドプールが容量に達しているかどうかを確認し、有効であれば新しいスレッドをスピンオフします。
Main Service Thread
> Sleep n. seconds
> ThreadPool < 100?
> New Thread
私は間違った方法でそれを置くと思います。私は私の質問を修正した。 – Dnana
あなたがSystem.Threading.ThreadPool
を使用している場合は、あなたが同時に実行されるスレッドの最大数を制御することができますSetMaxThreadsと呼ばれる機能があります。また、並行スレッドの数の変更については、そのページの注釈を書き留めておいてください。
このコードは、必要なものを示しています。
セマフォー(Semaphore、より良いパフォーマンスと同じ)オブジェクトを使用してください。
セマフォをカウンタとして考えます。あなたが待つたびに、1つの数字が下がります。操作の最後にそれを解放する必要があります。
カウンタが0の場合、セマフォを取得できません。
ThreadPoolの提案については、スレッドプールがアプリケーションの多くの部分で使用されているため、これは良い考えではないと思います。
class Program
{
private static SemaphoreSlim threadsSemaphore = new SemaphoreSlim(5, 5);
static void Main(string[] args)
{
Timer timer = new Timer(DoSomeWork, null, 0, 100);
Console.ReadKey();
}
private static void DoSomeWork(object state)
{
if (threadsSemaphore.Wait(TimeSpan.FromSeconds(1)))
{
try
{
Console.WriteLine("Doing work ...");
Thread.Sleep(1000);
}
finally
{
threadsSemaphore.Release();
}
}
else
{
Console.WriteLine("Skipping work", threadsSemaphore.CurrentCount);
}
}
}
私はそれを試してみましょう。 – Dnana
Windowsサービスのインスタンスを複数持つことはできません。あなたがそれを意図的にしていない限り:http://www.codeproject.com/KB/dotnet/MultipleInstNetWinService.aspx? –
これはXYの問題です。あなたの解決策を尋ねるのではなく、問題の内容を教えてください。 –