2011-11-04 20 views
27

Yeni bir iş parçacığı üzerinde bir yöntem (C# kullanarak) aramak için bir yöntem arıyorum. Örneğin, yeni bir iş parçacığı üzerinde SecondFoo()'u aramak istiyorum. Ancak, SecondFoo() tamamlandığında iş parçacığının sonlandırılmasını isterim.C# Yeni bir iş parçacığında bir yöntem çağırın

C# numaralı belgede birkaç iş parçacığı örneği gördüm, ancak bu özel senaryo için geçerli olan hiçbiri yok; Kendini feshetmek için yumurtlu ipliklere ihtiyacım var. Mümkün mü?

Tamamlandığında sona erdirmek için Secondfoo() çalıştıran yumrulamayı nasıl zorlayabilirim?

Bunların herhangi biriyle karşılaşan var mı ???

Çok teşekkürler, Brett

+3

Secondfoo() geri döndüğünde, çalıştığı iş parçacığı sona erer. Neden böyle olmadığını düşünüyorsun? –

+0

ThreadPool'u kullanamamanın bir nedeni var mı? –

cevap

61

aslında yeni bir iş parçacığı başlatırsanız, yöntem bittiğinde, o iplik sona erer:

Şimdi SecondFoo yeni iplik adı verilecek
Thread thread = new Thread(SecondFoo); 
thread.Start(); 

ve iş parçacığı tamamlandığında sona erer.

aslındayöntem iplik tamamlar ararken sonlandırmak için iplik istediği anlamına mü?

DÜZENLEME: Bir iş parçacığı başlatmanın makul maliyetli bir işlem olduğunu unutmayın. Bir iş parçacığı iş parçacığı kullanmaktan ziyade yeni iş parçacığına ihtiyacınız var mı? ThreadPool.QueueUserWorkItem veya (.NET 4 kullanıyorsanız, tercihen) TaskFactory.StartNew kullanmayı düşünün.

+1

Bu, :-) Yürütülecek daha fazla ifade olmadığında bir iş parçacığının sonlanmasından habersizdim. Yani ihtiyacım olan tam cevap bu. Çok teşekkürler!!! – Brett

41

Gerçekten bir iş parçacığı olmalı mı yoksa bu bir görev olabilir mi?

eğer öyleyse, en kolay yoludur:

Action secondFooAsync = new Action(SecondFoo); 

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

     }), secondFooAsync); 

: olmayan bir iş parçacığı havuzu iş parçacığı gerektiren özel bir durum yoksa

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

veya sadece “Task.Run” – Omu

1

, sadece böyle bir iş parçacığı havuzu iş parçacığı kullanmak EndInvoke'un sizin için temizliğe özen göstermesi gereken garantiler.

+0

Yeni bir iş parçacığında uzun bir işlem raporu çalıştırmak için önce beginInvoke kullandım. İşte BeginInvoke bir MSDN makalesi: http://msdn.microsoft.com/en-us/library/2e08f6yc%28v=vs.71%29.aspx – William

+3

'ThreadPool.QueueUserWorkItem' çağırmak daha kolay ... –

-2

Anladığım kadarı ile doğru olarak Thread.Abort() olarak sonlandırmanız gerekiyor mu? Bu durumda, Foo'dan() çıkabilirsiniz. Ya da iş parçacığını yakalamak için Process'u kullanabilirsiniz.

Thread myThread = new Thread(DoWork); 

myThread.Abort(); 

myThread.Start(); 

Süreç örnek: sadece bunu başlatmak ve unutun böylece .Net parçacıkları olarak

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

Konu Havuz tarafından yönetilir! Bu kodu düşünün.

new Thread(new ThreadStart(SecondFoo)).Start(); 
İlgili konular