2012-05-19 23 views
13

Có ai cho tôi một chủ đề về chủ đề luồng không? Tôi nghĩ tôi biết cách thực hiện một số việc nhưng tôi cần biết cách thực hiện như sau:C# Luận văn - Cách bắt đầu và dừng một chủ đề

Thiết lập chuỗi chính sẽ hoạt động cho đến khi tôi báo hiệu dừng (trong trường hợp bạn tự hỏi, nó sẽ chấm dứt khi dữ liệu Đã nhận). Sau đó, tôi muốn một thread thứ hai để bắt đầu mà sẽ nắm bắt dữ liệu từ một hộp văn bản và nên bỏ thuốc lá khi tôi báo hiệu nó đến mà trong đó xảy ra khi người dùng nhấn phím enter.

Chúc mừng!

+0

chỉ cần sử dụng một vòng lặp while trên thread khác cho đến khi nó nhận dữ liệu –

+0

Bắt đầu một sợi là rất dễ dàng. Dừng một là vô cùng khó khăn. Tập trung vào việc dừng lại. –

+1

Bạn có thể xem xét sử dụng BackgroundWorker. Nó có các lời gọi lại sự kiện an toàn chủ đề khá tiện lợi nếu bạn cần thao tác các thành phần biểu mẫu/điều khiển. – climbage

Trả lời

16

Đây là cách tôi làm điều đó ...

public class ThreadA { 
    public ThreadA(object[] args) { 
     ... 
    } 
    public void Run() { 
     while (true) { 
      Thread.sleep(1000); // wait 1 second for something to happen. 
      doStuff(); 
      if(conditionToExitReceived) // what im waiting for... 
       break; 
     } 
     //perform cleanup if there is any... 
    } 
} 

Sau đó, để chạy trong chủ đề riêng của mình ... (Tôi làm theo cách này vì tôi cũng muốn gửi args để thread)

private void FireThread(){ 
    Thread thread = new Thread(new ThreadStart(this.startThread)); 
    thread.start(); 
} 
private void (startThread){ 
    new ThreadA(args).Run(); 
} 

Các chủ đề được tạo ra bằng cách gọi "FireThread()"

Các chủ đề mới được tạo ra sẽ chạy cho đến khi tình trạng của mình cho s đầu được đáp ứng, sau đó nó chết ...

Bạn có thể đánh dấu sự "chính" với các đại biểu, để nói với nó khi thread đã chết .. vì vậy bạn có thể bắt đầu một giây ...

nhất để đọc qua: This MSDN Article

+0

Lưu ý rằng cách tiếp cận này tạo cơ hội cho đến một giây trễ giữa các công cụ để hiển thị và thực sự thực hiện các công cụ. Không nhất thiết phải xấu, phụ thuộc vào yêu cầu của bạn. Tôi hiện đang googling cho cách tốt nhất để sử dụng một chủ đề nền công nhân bằng cách sử dụng một EventWaitHandle cho cross-process/thread signaling, nhưng sau đó tôi có may mắn để có quyền kiểm soát cả hai quá trình (máy phát điện thứ và công cụ do-er). Điều này sẽ loại bỏ bất kỳ độ trễ bỏ phiếu nào. –

5
Thread th = new Thread(function1); 
th.Start(); 
th.Abort(); 

void function1(){ 
//code here 
} 
+12

Tôi nghĩ rằng 'Abort()' nên là một cuộc gọi cuối cùng. Sẽ tốt hơn nếu bạn đặt cờ và chặn chuỗi một cách duyên dáng. – climbage

+9

-1: Tôi xin lỗi, nhưng 'Thread.Abort' gần như là _never_ cách để làm điều đó. Một vòng lặp với 'ManualResetEvent' - hoặc thậm chí một cờ boolean dễ bay hơi - sẽ là một cách tiếp cận an toàn hơn. – Douglas

4

Sử dụng AutoResetEvent tĩnh trong chủ đề được sinh ra của bạn để gọi lại chủ đề chính bằng phương thức Set(). Anh chàng này có một bản demo khá tốt trong SO về cách sử dụng nó.

AutoResetEvent clarification

Các vấn đề liên quan