2011-11-04 36 views
27

Tôi đang tìm cách gọi phương thức trên một chủ đề mới (sử dụng C#). Ví dụ: , tôi muốn gọi số SecondFoo() trên một chủ đề mới. Tuy nhiên, sau đó tôi muốn kết thúc chuỗi khi kết thúc SecondFoo().C# Gọi phương thức trong một chủ đề mới

Tôi đã thấy một số ví dụ về luồng trong C#, nhưng không có ví dụ nào áp dụng cho trường hợp cụ thể này; nơi tôi cần các sợi sinh ra để chấm dứt chính nó. Điều này có thể không?

Làm cách nào để buộc chủ đề được sinh ra đang chạy Secondfoo() chấm dứt khi hoàn thành?

Có ai đi qua bất kỳ ví dụ nào về điều này không ???

Rất cám ơn, Brett

+3

Khi Secondfoo() trả về, chuỗi đang chạy sẽ chấm dứt. Tại sao bạn nghĩ rằng nó không? –

+0

Có lý do nào khiến bạn không thể sử dụng ThreadPool không? –

Trả lời

61

Nếu bạn thực sự bắt đầu một chủ đề mới, mà chủ đề sẽ chấm dứt khi phương pháp này kết thúc:

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

Bây giờ SecondFoo sẽ được gọi trong các chủ đề mới, và chuỗi sẽ chấm dứt khi hoàn thành.

Bạn có thực sự có nghĩa là bạn muốn chuỗi kết thúc khi phương thức trong chuỗi gọi hoàn tất?

CHỈNH SỬA: Lưu ý rằng bắt đầu một chuỗi là một hoạt động hợp lý tốn kém. Bạn có chắc chắn cần một thương hiệu mới chủ đề thay vì sử dụng một thread threadpool? Cân nhắc sử dụng ThreadPool.QueueUserWorkItem hoặc (tốt nhất là nếu bạn đang sử dụng .NET 4) TaskFactory.StartNew.

+1

Đây là :-) Tôi đã không biết rằng một chuỗi chấm dứt khi không có thêm câu lệnh để thực hiện. Vì vậy, đây là câu trả lời chính xác mà tôi cần. Cảm ơn nhiều!!! – Brett

41

Nó thực sự phải là một chủ đề hay nó có thể là một nhiệm vụ không?

nếu như vậy, cách dễ nhất là:

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

hoặc chỉ 'Task.Run' – Omu

1

Trừ khi bạn có một tình huống đặc biệt mà đòi hỏi phải có một sợi không thread-pool, chỉ cần sử dụng một thread hồ bơi như thế này:

Action secondFooAsync = new Action(SecondFoo); 

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

     }), secondFooAsync); 

Gaurantees rằng EndInvoke được gọi là để chăm sóc làm sạch cho bạn.

+0

Tôi đã sử dụng beginInvoke trước để chạy một báo cáo xử lý dài trong một chuỗi mới. Đây là một bài viết MSDN trên BeginInvoke: http://msdn.microsoft.com/en-us/library/2e08f6yc%28v=vs.71%29.aspx – William

+3

Thật dễ dàng để gọi 'ThreadPool.QueueUserWorkItem' ... –

-2

Theo như tôi hiểu, bạn cần chấm dứt có nghĩa là Thread.Abort() phải không? Trong trường hợp này, bạn chỉ có thể thoát khỏi Foo(). Hoặc bạn có thể sử dụng Process để bắt chủ đề.

Thread myThread = new Thread(DoWork); 

myThread.Abort(); 

myThread.Start(); 

Process Ví dụ:

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

Trong Net Chủ đề này được quản lý bởi Chủ đề Pool vì vậy bạn chỉ có thể bắt đầu nó và quên nó đi! Hãy xem xét mã này.

new Thread(new ThreadStart(SecondFoo)).Start(); 
Các vấn đề liên quan