我正在寫一個由定時器啓動的windows服務,並且每分鐘都會耗費一些時間。我想限制沒有。一次運行的服務實例數量爲100.我該怎麼做?任何想法?限制no。 Windows服務中的實例
編輯:我想限制沒有。由定時器啓動的線程。
我正在寫一個由定時器啓動的windows服務,並且每分鐘都會耗費一些時間。我想限制沒有。一次運行的服務實例數量爲100.我該怎麼做?任何想法?限制no。 Windows服務中的實例
編輯:我想限制沒有。由定時器啓動的線程。
這聽起來像一個非常糟糕的設計 - 和一個內存/ cpu豬。我不確定當你說100個Windows服務時,我理解你的意思 - 因爲服務是一項服務。至少在具有獨特服務的意義上說。你是否通過任務管理器啓動了100個隱藏在後臺運行的應用程序?如果是這樣的話,你可以通過創建一個真正的Windows服務並使用該服務中的邏輯來控制應用程序的流程(以及運行代碼的多個實例的執行)來實現更好的效果。
例如,你可以有一個主服務,其中一個主線程可以睡n個。秒,然後執行。主線程喚醒後,它將負責分離新線程。例如,您可以使用線程池,而您可以控制活動的線程數。您的主線程將檢查線程池以確定它是否已達到容量,並且如果有效,請關閉一個新線程。
Main Service Thread
> Sleep n. seconds
> ThreadPool < 100?
> New Thread
我想我把這個方法弄錯了。我糾正了我的問題。 – Dnana
如果您使用System.Threading.ThreadPool
,有一個名爲SetMaxThreads功能,您可以控制同時運行的線程的最大數量。另外,請記下該頁面上有關更改併發線程數的說明。
此代碼演示您需要什麼。
只要使用theSmaphoreSlim(與信號量相同,性能更好)的對象來做到這一點。
想想信號量是一個計數器。每次你等待計數器下降一個數字。在操作結束時需要釋放它。
當計數器爲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問題。不要問你的解決方案,告訴我們問題是什麼? –