मैंने एक साथ रखा है (मुझे लगता है) नौकरी करता है। अगर मुझे लगता है तो कृपया मुझे बताएं। यह कैसे काम करता है इसका एक सरल उदाहरण है।
var backgroundWorker = new BackgroundWorker(){WorkerSupportsCancellation = true};
backgroundWorker.DoWork += (sender, args) =>
{
var thisWorker = sender as BackgroundWorker;
var _child = new Thread(() =>
{
//..Do Some Code
});
_child .Start();
while (_child.IsAlive)
{
if (thisWorker.CancellationPending)
{
_child.Abort();
args.Cancel = true;
}
Thread.SpinWait(1);
}
};
backgroundWorker.RunWorkerAsync(parameter);
//..Do Something...
backgroundWorker.CancelAsync();
चूंकि पृष्ठभूमि कार्यकर्ता थ्रेड पूल का हिस्सा है, इसलिए हम इसे रद्द नहीं करना चाहते हैं। लेकिन हम आंतरिक रूप से एक थ्रेड चला सकते हैं जिसे हम निरस्त करने की अनुमति दे सकते हैं। पृष्ठभूमिवर्कर तब मूल रूप से तब तक चलता है जब तक कि बच्चा धागा पूरा न हो या हम प्रक्रिया को मारने के लिए इसका संकेत दें। बैकग्राउंड वर्कर थ्रेड फिर रीड पूल में वापस जा सकता है। आम तौर पर मैं इसे एक सहायक वर्ग में लपेटूंगा और प्रतिनिधि विधि के माध्यम से गुजरता हूं कि मैं चाहता हूं कि पृष्ठभूमि धागा पैरामीटर के रूप में पारित हो और बच्चे के थ्रेड में चलाए।
कृपया मुझे बताएं कि क्या मैं दीवार के खिलाफ अपने सिर को टक्कर लगी हूं लेकिन ऐसा लगता है कि यह ठीक काम करता है .. लेकिन थ्रेड के साथ समस्या यह नहीं है .. अलग-अलग समय पर आप इसे चलाने के दौरान अलग-अलग परिणाम प्राप्त कर सकते हैं।
मैंने पाया SerialPort.DataReceived एक सा सीएफ में भ्रमित हो, अगर impl एफएफ में बेहतर है पता नहीं है। सीएफ एक अपेक्षाकृत अधिक थ्रेड का उपयोग करता है, जिससे आप उम्मीद कर सकते हैं। – Quibblesome
पृष्ठभूमिवर्कर के बारे में टिप्पणी के लिए लगभग 1 तक लुभाना; यह यूआई थ्रेड में कुछ मानकों और स्वचालित रूप से मार्शल इवेंट्स को लागू करने के लिए डिज़ाइन किया गया है, जो इसके उपयोग के वैध कारण हैं; थ्रेडिंग को समझने से समस्याएं पैदा नहीं होंगी इससे कोई फर्क नहीं पड़ता कि आप किस तरह से जाते हैं। –
जब तक सामान्य थ्रेड से UI थ्रेड के साथ सिंक्रनाइज़ करने का कोई आसान तरीका न हो ... – Glimpse