2011-10-27 15 views
21

क्या यह पृष्ठभूमि थ्रेड के लिए एक अच्छा डिज़ाइन है जिसे टास्क एपीआई का उपयोग नेट 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 जो जो करने के लिए धागा लाने का उपयोग कर सकते एक अंत।

उत्तर

18

जैसा कि आपने पहले ही उल्लेख किया है, आप रद्द करना टोकन का उपयोग कर सकते हैं। यह इस तरह से करें: अपनी लंबी चलने कार्य में

cancellationTokenSource.Cancel(); 

आप, टोकन पूछ सकते हैं, तो रद्द करने का अनुरोध किया गया:

var cancellationTokenSource = new CancellationTokenSource(); 
Task.Factory.StartNew(RemoveFromBlockingCollection 
         , TaskCreationOptions.LongRunning 
         , cancellationTokenSource.Token); 

और बाद में अपने कोड में, आप के साथ काम रद्द कर सकते हैं

if (cancellationTokenSource.Token.IsCancellationRequested) 
+0

धागे को जीवित रखने के लिए बूलियन का उपयोग सबसे अच्छा अभ्यास है या क्या कोई एपीआई कॉल है? मैंने पाया है कि मैं ब्लॉकिंग कोलेक्शन पर पूर्ण एडिंग विधि का उपयोग कर सकता हूं लेकिन अगर मैं अवरुद्ध करने का चयन नहीं कर रहा हूं और कुछ और कर रहा हूं तो बूलियन स्वीकार्य होगा? – Jon

+0

हां, यह काम करेगा। या आप उपरोक्त वर्णित रद्दीकरण टोकन का उपयोग करते हैं। – Fischermaen

+0

मैं थ्रेड को रद्द करने के लिए इसका उपयोग कर सकता हूं, मैं सिर्फ थ्रेड चलाने के लिए आपकी राय पूछ रहा था? – Jon

संबंधित मुद्दे