2008-09-08 14 views
7

Tôi có kiến ​​thức cơ bản về đa luồng, nhưng chưa bao giờ phải làm bất cứ điều gì ngoài các tính giờ đơn giản trong một ứng dụng. Có ai biết một nguồn tài nguyên tốt mà sẽ cho tôi một tour du lịch làm thế nào để làm việc với các ứng dụng đa luồng, giải thích những điều cơ bản và có thể đặt ra một số công cụ khó khăn hơn?Tôi hiểu luồng trong lý thuyết nhưng không thực tế trong .net

Trả lời

23

Đây là tài nguyên miễn phí tuyệt vời của Joseph Albahari. Threading in C#

5

Có 4 cách cơ bản để đồng bộ hóa bài trong Net:

  • kiểm soát BackgroundWorker
  • WaitHandles
  • chức năng gọi lại
  • bỏ phiếu một đối tượng asyncResult

Nói chung, bạn muốn để bắt đầu ở đầu danh sách đó và làm việc. Điều đó có nghĩa là cái nhìn đầu tiên và xem liệu điều khiển nền tảng có phù hợp với tình huống không. Tuy nhiên, nó khá nhiều giả định các hình thức cửa sổ và rằng bạn chỉ sinh ra một sợi mới.

Vì vậy, hãy thử waithandles tiếp theo. Waithandles là tốt cho phối hợp một số chủ đề với nhau. Bạn có thể đá tất cả chúng ra và chờ đợi cho họ tất cả để kết thúc, hoặc nếu bạn muốn giữ một số lượng nhất định hoạt động bạn tiếp tục chờ đợi chỉ là một và sinh sản tiếp theo khi nó kết thúc. Hoặc có thể bạn biết một chủ đề sẽ hoàn thành sớm hơn nhiều, vì vậy bạn có thể đợi cho đến khi hoàn thành, thực hiện một chút công việc và sau đó đợi phần còn lại kết thúc.

Waithandles có thể có vẻ hơi nhiều nếu, giả sử bạn chỉ sinh ra một chuỗi bổ sung và bạn không muốn chặn cho đến khi hoàn tất. Sau đó, bạn có thể sử dụng một cuộc gọi lại, để chức năng bạn chỉ định sẽ được gọi ngay khi chuỗi hoàn tất.

Cuối cùng, nếu và chỉ nếu vì một lý do nào đó, không có lý do nào ở trên có hiệu quả, bạn có thể quay trở lại bỏ phiếu.

tôi có thể nghĩ ra 5 cách khác nhau để có được một chủ đề mới trong Net, cũng xấp xỉ theo thứ tự:

  • OS tạo ra, thường là kết quả của sự kiện winforms (bao gồm cả BackgoundWorker).
  • Obj.Begin ___()/Kết thúc ____(). Một số lớp CLR đã có các phương thức không đồng bộ này được xác định cho bạn và rõ ràng là bạn muốn sử dụng chúng khi chúng có sẵn.
  • ThreadPool.QueueUserWorkItem(). Sử dụng phần lớn thời gian để tạo chủ đề của riêng bạn.
  • Delegate.BeginInvoke()/EndInvoke(). Bạn có thể bọc bất kỳ phương pháp theo cách này.
  • Thread.Start(). Bạn có thể làm theo cách này, nhưng tôi đã đọc một cái gì đó gần đây (không có liên kết ngay bây giờ) nếu QueueUserWorkItem sẽ không hoạt động, phương thức ủy nhiệm có lẽ tốt hơn.
1

Một trong những nguồn lực tốt nhất mà tôi biết về đề tài này là "luồng trong C#" cuốn sách: http://www.albahari.com/threading/

Tôi có một tổng quan tuyệt vời của tất cả các nhà phát triển .net cần hiểu để lập trình các ứng dụng đa luồng.

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