2011-11-04 16 views
27

मैं एक नए धागे (सी # का उपयोग कर) पर एक विधि को कॉल करने का एक तरीका ढूंढ रहा हूं। उदाहरण के लिए , मैं एक नए थ्रेड पर SecondFoo() पर कॉल करना चाहता हूं। हालांकि, मैं SecondFoo() खत्म होने पर थ्रेड समाप्त करना चाहता हूं।सी # एक नए थ्रेड में एक विधि को कॉल करें

मैंने C# में थ्रेडिंग के कई उदाहरण देखे हैं, लेकिन कोई भी इस विशिष्ट परिदृश्य पर लागू नहीं होता है; जहां मुझे खुद को समाप्त करने के लिए तैयार धागे की आवश्यकता होती है। क्या यह संभव है?

मैं पूरा होने पर समाप्त होने के लिए Secondfoo() चलने वाले स्प्रेड किए गए थ्रेड को कैसे मजबूर कर सकता हूं?

क्या कोई इस के किसी भी उदाहरण में आया है ???

बहुत धन्यवाद, ब्रेट

+3

जब सेकेंडफू() लौटाता है, तो जिस थ्रेड पर चल रहा है वह समाप्त हो जाएगा। आपको ऐसा क्यों लगता है? –

+0

क्या कोई कारण है कि आप थ्रेडपूल का उपयोग क्यों नहीं कर सकते? –

उत्तर

61

आप वास्तव में एक नया धागा शुरू करते हैं, कि धागा समाप्त होगा जब विधि खत्म:

Thread thread = new Thread(SecondFoo); 
thread.Start(); 

अब SecondFoo नया थ्रेड में बुलाया जाएगा, और जब यह पूरा हो जाता है तो थ्रेड समाप्त हो जाएगा।

आप वास्तव में मतलब था कि आप जब में विधि बुला धागा पूरा करता है समाप्त करने के लिए धागा चाहते थे?

संपादित करें: ध्यान दें कि धागा शुरू करना एक उचित महंगी ऑपरेशन है। क्या आपको निश्चित रूप से थ्रेडपूल थ्रेड का उपयोग करने के बजाय नया धागा ब्रांड की आवश्यकता है? ThreadPool.QueueUserWorkItem या (अधिमानतः, यदि आप .NET 4 का उपयोग कर रहे हैं) TaskFactory.StartNew का उपयोग करने पर विचार करें।

+1

यह है :-) मुझे पता नहीं था कि निष्पादित करने के लिए कोई और कथन नहीं होने पर थ्रेड समाप्त हो जाता है। तो यह सही जवाब है जिसकी मुझे आवश्यकता थी। बहुत धन्यवाद!!! – Brett

41

क्या यह वास्तव में एक धागा होना है, या यह एक कार्य भी हो सकता है?

अगर ऐसा है, सबसे आसान तरीका है:

Action secondFooAsync = new Action(SecondFoo); 

secondFooAsync.BeginInvoke(new AsyncCallback(result => 
     { 
     (result.AsyncState as Action).EndInvoke(result); 

     }), secondFooAsync); 

:

Task.Factory.StartNew(() => SecondFoo()) 
+0

या बस 'टास्क.रुन' – Omu

1

जब तक आप एक विशेष स्थिति है कि एक गैर धागा पूल धागा की आवश्यकता है, सिर्फ इस तरह एक धागा पूल धागा का उपयोग गोरियस कि एंडइनवोक को आपके लिए साफ-सफाई की देखभाल करने के लिए बुलाया जाता है।

+0

मैंने एक नए थ्रेड में एक लंबी प्रोसेसिंग रिपोर्ट चलाने के लिए startInvoke का उपयोग किया है। BeginInvoke पर एक एमएसडीएन आलेख यहां दिया गया है: http://msdn.microsoft.com/en-us/library/2e08f6yc%28v=vs.71%29.aspx – William

+3

'ThreadPool.QueueUserWorkItem' को कॉल करना आसान है ... –

-2

जहाँ तक मुझे समझ में आता है कि आपको Thread.Abort() सही के रूप में समाप्त करने की आवश्यकता है? इस मामले में, आप केवल Foo() से बाहर निकल सकते हैं। या आप धागे को पकड़ने के लिए Process का उपयोग कर सकते हैं।

Thread myThread = new Thread(DoWork); 

myThread.Abort(); 

myThread.Start(); 

प्रक्रिया उदाहरण:

using System; 
using System.Diagnostics; 
using System.ComponentModel; 
using System.Threading; 
using Microsoft.VisualBasic; 

class PrintProcessClass 
{ 

    private Process myProcess = new Process(); 
    private int elapsedTime; 
    private bool eventHandled; 

    // Print a file with any known extension. 
    public void PrintDoc(string fileName) 
    { 

     elapsedTime = 0; 
     eventHandled = false; 

     try 
     { 
      // Start a process to print a file and raise an event when done. 
      myProcess.StartInfo.FileName = fileName; 
      myProcess.StartInfo.Verb = "Print"; 
      myProcess.StartInfo.CreateNoWindow = true; 
      myProcess.EnableRaisingEvents = true; 
      myProcess.Exited += new EventHandler(myProcess_Exited); 
      myProcess.Start(); 

     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("An error occurred trying to print \"{0}\":" + "\n" + ex.Message, fileName); 
      return; 
     } 

     // Wait for Exited event, but not more than 30 seconds. 
     const int SLEEP_AMOUNT = 100; 
     while (!eventHandled) 
     { 
      elapsedTime += SLEEP_AMOUNT; 
      if (elapsedTime > 30000) 
      { 
       break; 
      } 
      Thread.Sleep(SLEEP_AMOUNT); 
     } 
    } 

    // Handle Exited event and display process information. 
    private void myProcess_Exited(object sender, System.EventArgs e) 
    { 

     eventHandled = true; 
     Console.WriteLine("Exit time: {0}\r\n" + 
      "Exit code: {1}\r\nElapsed time: {2}", myProcess.ExitTime, myProcess.ExitCode, elapsedTime); 
    } 

    public static void Main(string[] args) 
    { 

     // Verify that an argument has been entered. 
     if (args.Length <= 0) 
     { 
      Console.WriteLine("Enter a file name."); 
      return; 
     } 

     // Create the process and print the document. 
     PrintProcessClass myPrintProcess = new PrintProcessClass(); 
     myPrintProcess.PrintDoc(args[0]); 
    } 
} 
4

नेट धागे में थ्रेड पूल द्वारा प्रबंधित कर रहे हैं ताकि आप इसे शुरू करने और इसके बारे में भूल सकता है! इस कोड पर विचार करें।

new Thread(new ThreadStart(SecondFoo)).Start(); 
संबंधित मुद्दे