.Net 3.5'te çok iş parçacığı olan bir windows hizmetim var ve birden çok iş parçacığı oluşturulduğunda hizmetin düzgün bir şekilde durması için bir sorun yaşıyorum.Çok iş parçacıklı pencere hizmetini durdurma
Bu hizmet, tüm işleri yapmak için yalnızca bir iş parçacığı oluşturmak için kullanıldı ve ben bunu çok iş parçacıklı olarak değiştirdim. Mükemmel çalışır, ancak hizmet durdurulduğunda, birden fazla iş parçacığı yürütülürse, tüm iş parçacıkları tamamlanana kadar hizmeti askıya alır.
//Tried with and without this attribute with no success...
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
public void StartThreadPool()
{
while (serviceStarted)
{
ProcessInfo input = new ProcessInfo();
try
{
int? NumPendingRequests = GetItems(50, (Guid?)input.ProcessID);
if (NumPendingRequests > 0)
{
input.ProcessType = 1;
input.ProcessID = Guid.NewGuid();
ThreadPool.QueueUserWorkItem(new WaitCallback(new DispatchManager().ProcessRequestList), input);
}
}
catch (Exception ex)
{
//Some Logging here
}
}
DeliveryConstant.StopService = true;
}
Ben ayrı sınıfta bir statik değişkeni oluşturdu:
İşte
protected override void OnStart(string[] args)
{
try
{
//Global variable that is checked by threads to learn if service was stopped
DeliveryConstant.StopService = false;
bool SetMaxThreadsResult = ThreadPool.SetMaxThreads(10, 10);
ThreadStart st = new ThreadStart(StartThreadPool);
workerThread = new Thread(st);
workerThread.IsBackground = true;
serviceStarted = true;
workerThread.Start();
}
catch (Exception ex)
{
//Log something;
}
StartThreadPool yöntemidir: Hizmet başlatıldığında
, ana süreç işlemek için bir arka plan iş parçacığı oluşturmak Hizmetin durduğu konuları bildirmek için Bu değişkenin değeri doğru olduğunda, bütün iplikleri (her döngü için) ana döngüyü durdurmak gerekir: public static bool StopService;
Son olarak, OnStop yöntem: ProcessRequestList yöntemde
protected override void OnStop()
{
DeliveryConstant.StopService = true;
//flag to tell the worker process to stop
serviceStarted = false;
workerThread.Join(TimeSpan.FromSeconds(30));
}
en Her foreach'in sonu, StopService değişkeninin değerini kontrol ediyorum. Eğer doğruysa, döngüyü kırarım.
İşte sorun: Konular 50 öğeden oluşan parçalar halinde oluşturulmuştur. Veritabanında 50 veya daha az öğe olduğunda, yalnızca bir iş parçacığı oluşturulur ve her şey güzel çalışır. 50'den fazla öğeye sahip olduğumda, birden fazla iş parçacığı oluşturulacak ve hizmeti durdurmaya çalıştığımda, tüm arka plan iş parçacıkları tamamlanana kadar durmuyor.
Günlüklerden, OnStop yönteminin yalnızca tüm iş parçacıklarının tamamlanmasından sonra yürütüldüğünü görebiliyorum.
Bunu düzeltmek için nelerin değiştirilmesi gerektiğine dair bir ipucu var mı?
while döngüsüne Uyku (50) koymayı deneyin. –
Bana öyle geliyor ki, kodun en önemli kısmını eklemediniz. Bu ProcessRequestList yönteminin uygulanmasıdır. –
StopService'in sorgulandığı kodu gösterebilir misiniz? Bu tür bir şey için yapıldığı için, Statlation var sayısının Statik var üzerinden kullanılmasına bakın. – hatchet