क्या यह पृष्ठभूमि थ्रेड के लिए एक अच्छा डिज़ाइन है जिसे टास्क एपीआई का उपयोग नेट 4 में चलाने की आवश्यकता है? मेरी एकमात्र चिंता यह है कि अगर हम उस कार्य को रद्द करना चाहते हैं तो मैं इसे कैसे करूं? मुझे पता है कि मैं बस ProgramEnding
से true
पर सेट कर सकता हूं लेकिन मुझे पता है कि टास्क एपीआई में CancellationToken
है।बेस्ट प्रैक्टिस लॉन्ग राउंडिंग टास्क सृजन
यह कोड का एक उदाहरण नमूना है ताकि एक धागा संग्रह में जोड़ दिया जा सके और दूसरा धागा इसे हटा देगा। के रूप में इस की जरूरत है, जबकि कार्यक्रम चल रहा है लगातार चल रहा हो टास्क LongRunning के रूप में सेटअप है
private void RemoveFromBlockingCollection()
{
while (!ProgramEnding)
{
foreach (var x in DataInQueue.GetConsumingEnumerable())
{
Console.WriteLine("Task={0}, obj={1}, Thread={2}"
, Task.CurrentId, x + " Removed"
, Thread.CurrentThread.ManagedThreadId);
}
}
}
private void button1_Click(object sender, EventArgs e)
{
DataInQueue = new BlockingCollection<string>();
var t9 = Task.Factory.StartNew(RemoveFromBlockingCollection
, TaskCreationOptions.LongRunning);
for (int i = 0; i < 100; i++)
{
DataInQueue.Add(i.ToString());
Console.WriteLine("Task={0}, obj={1}, Thread={2}",
Task.CurrentId, i + " Added",
Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(100);
}
ProgramEnding = true;
}
अद्यतन: मैं ने पाया है कि मैं ProgramEnding बूलियन हटाने और DataInQueue.CompleteAdding जो जो करने के लिए धागा लाने का उपयोग कर सकते एक अंत।
धागे को जीवित रखने के लिए बूलियन का उपयोग सबसे अच्छा अभ्यास है या क्या कोई एपीआई कॉल है? मैंने पाया है कि मैं ब्लॉकिंग कोलेक्शन पर पूर्ण एडिंग विधि का उपयोग कर सकता हूं लेकिन अगर मैं अवरुद्ध करने का चयन नहीं कर रहा हूं और कुछ और कर रहा हूं तो बूलियन स्वीकार्य होगा? – Jon
हां, यह काम करेगा। या आप उपरोक्त वर्णित रद्दीकरण टोकन का उपयोग करते हैं। – Fischermaen
मैं थ्रेड को रद्द करने के लिए इसका उपयोग कर सकता हूं, मैं सिर्फ थ्रेड चलाने के लिए आपकी राय पूछ रहा था? – Jon