2010-05-09 77 views
6

Tôi đã đọc các bài viết trên MSDN, nhưng tâm trí của tôi đã chết (điều này thường xảy ra khi tôi đọc MSDN (Không có MSDN phạm tội, nhưng bài viết của bạn gây nhầm lẫn cho tôi.)), Và tôi đang cố gắng làm một số "công việc nền" trong ứng dụng của tôi, nhưng không chắc chắn như thế nào. Nó chỉ là một phương pháp duy nhất. Nhưng ứng dụng bị treo, và tôi phải đợi tới 1 - 3 phút để nó trở thành ... không hề bị tổn thương?Ứng dụng đa luồng

Có bất kỳ ví dụ đơn giản nào đang đặt 'vòng trực tuyến ở đâu đó mà tôi có thể xem/chơi cùng không?

Cảm ơn tất cả các bạn

+1

bạn có thực hiện cuộc gọi trực tiếp để tạo điều khiển từ chuỗi nền không? – volody

+0

Tôi xin lỗi, volody. Đây là nỗ lực đầu tiên của tôi về đa luồng. Tôi đã không bao giờ cần đa luồng trong quá khứ. –

+1

@volody; Bây giờ tôi hiểu ý của bạn là gì. Không. Tôi không có kế hoạch thực hiện bất kỳ cuộc gọi nào để tạo điều khiển từ một chuỗi nền. :) –

Trả lời

0

Đã có this decent question có nhiều liên kết đến các bài viết dễ tiêu hóa hơn MSDN.

Bài viết của Jon Skeet là dễ nhất và có lẽ là toàn diện nhất để bắt đầu, và loạt bài của Joe Duffy đi sâu vào rất nhiều. Duyệt các thẻ C# & Multithreading trong Stackoverflow cũng cung cấp cho bạn một số câu trả lời hay.

Bạn có thể thấy tránh BackgroundWorker cách nhanh nhất để có được đi, và chỉ cần sử dụng một Invoke:

void ButtonClick(object sender,EventArgs e) 
{ 
    Thread thread = new Thread(Worker); 
    thread.Start(); 
} 

void Worker() 
{ 
    if (InvokeRequired) 
    { 
     Invoke(new Action(Worker)); 
     return; 
    } 

    MyLabel.Text = "Done item x"; 
} 

Một số người thích sử dụng BackgroundWorker trên Stackoverflow, những người khác không (tôi đang ở trong số trại 2).

+1

Wow điều này trông đơn giản đáng ngạc nhiên! Và mã mà tôi đang sử dụng để thực hiện thao tác ... Tôi có đặt bất cứ đâu trong phương thức Worker() không? P.S. Cảm ơn bạn! :) –

+0

@ j-t-s Bất cứ nơi nào sau 'InvokeRequired', chỉ có ở đó để trao đổi với chuỗi giao diện người dùng để bạn có thể cập nhật các điều khiển của mình mà không bị ngoại lệ. –

+0

Tôi ước tôi có thể upvote điều này hai lần –

4

Jon Skeet đã viết introduction to multithreading in .NET đẹp mà bạn có thể đọc. Nó cũng bao gồm threading in WinForms. Nó có thể nằm trong số các dòng:

public partial class Form1 : Form 
{ 
    private BackgroundWorker _worker; 

    public Form1() 
    { 
     InitializeComponent(); 
     _worker = new BackgroundWorker(); 
     _worker.DoWork += (sender, e) => 
     { 
      // do some work here and calculate a result 
      e.Result = "This is the result of the calculation"; 
     }; 
     _worker.RunWorkerCompleted += (sender, e) => 
     { 
      // the background work completed, we may no 
      // present the result to the GUI if no exception 
      // was thrown in the DoWork method 
      if (e.Error != null) 
      { 
       label1.Text = (string)e.Result; 
      } 
     }; 
     _worker.RunWorkerAsync(); 
    } 
} 
+1

Cảm ơn Darin, tôi vẫn đang đọc các bài viết của Jon Skeet mà bạn đã đề cập. Rất thú vị và hữu ích. Cảm ơn bạn đã viết một mẫu cho tôi :) Rất nhiều đánh giá cao! Tôi đang thử nghiệm nó ngay bây giờ. :-) –

0

Darin đã nói với bạn lý thuyết.

Nhưng bạn nên kiểm tra phương pháp tĩnh ThreadPool.QueueUserWorkItem. Nó thuận tiện hơn.

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