मेरे पास .NET 3.5 में एक बहु-थ्रेड विंडो सेवा है, और मुझे एक से अधिक धागे बनाए जाने पर सेवा को ठीक से रोकने में कुछ परेशानी हो रही है।एक बहु थ्रेडेड विंडोज सेवा को रोकना
यह सेवा सभी काम करने के लिए केवल एक धागा बनाने के लिए प्रयुक्त होती है, और मैंने इसे बहु-थ्रेडेड के रूप में बदल दिया है। यह पूरी तरह से काम करता है, लेकिन जब सेवा बंद हो जाती है, यदि एक से अधिक धागे निष्पादित किए जा रहे हैं, तो यह सभी थ्रेड पूरा होने तक सेवा को लटका देगा।
//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;
}
मैं एक अलग वर्ग में एक स्थिर चर बनाया:
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 विधि है:
जब सेवा प्रारंभ कर रहा है, मैं मुख्य प्रक्रिया को संभालने के लिए एक पृष्ठभूमि धागा बनाने सेवा को रोक दिया गया था कि धागे को सूचित करने के लिए। अंत में OnStop विधि
public static bool StopService;
,:
protected override void OnStop()
{
DeliveryConstant.StopService = true;
//flag to tell the worker process to stop
serviceStarted = false;
workerThread.Join(TimeSpan.FromSeconds(30));
}
ProcessRequestList विधि में, पर जब इस चर के लिए मूल्य सच है, सभी धागे मुख्य लूप (एक प्रत्येक पाश के लिए) बंद कर देना चाहिए प्रत्येक foreach के अंत, मैं StopService चर के मूल्य की जांच। यदि सही है, तो मैंने लूप तोड़ दिया।
यहां समस्या है: धागे 50 वस्तुओं के टुकड़ों में बनाए जाते हैं। मैं 50 आइटम या डेटाबेस में कम है, तो केवल एक ही धागा बनाया जाता है, और सब कुछ खूबसूरती से काम करता है। जब मेरे पास 50 से अधिक आइटम हैं, तो एकाधिक थ्रेड बनाए जाएंगे, और जब मैं सेवा को रोकने का प्रयास करता हूं, तब तक यह तब तक नहीं रुकता जब तक कि सभी पृष्ठभूमि धागे पूरा नहीं हो जाते।
लॉग से, मैं देख सकता हूं कि ऑन थॉप्स विधि केवल सभी धागे पूर्ण होने के बाद ही निष्पादित की जाती है।
कोई सुराग जिसे ठीक करने के लिए बदला जा सकता है?
जबकि लूप में नींद (50) डालने का प्रयास करें। –
ऐसा लगता है कि आपने कोड का सबसे महत्वपूर्ण हिस्सा शामिल नहीं किया है। यह ProcessRequestList विधि कार्यान्वयन है। –
क्या आप कोड दिखा सकते हैं जहां StopService से पूछताछ की जाती है? स्थैतिक var पर CancellationToken का उपयोग करने में देखें, क्योंकि यह उस तरह की चीज़ के लिए बनाया गया है। – hatchet