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
Đây là tài nguyên miễn phí tuyệt vời của Joseph Albahari. Threading in C#
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.
Hai bài báo lớn:
What Every Dev Must Know About Multithreaded Apps
Understand the Impact of Low-Lock Techniques in Multithreaded Apps
Mặc dù bài viết này không phải là chính xác những gì bạn đang tìm kiếm cụ thể, nó sẽ hy vọng được hỗ trợ thường (tức là nó là liên quan và đọc rất tốt):
The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software
Một tốt web tài nguyên để tìm hiểu về đa luồng trong .NET:
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.
- 1. Thay thế có điều kiện với đa hình - đẹp về mặt lý thuyết nhưng không thực tế
- 2. Điều kiện tiên quyết để hiểu lý thuyết Wavelet
- 3. Giới hạn thực tế về số luồng trong Linux trong khung hợp tác
- 4. Gỡ rối phiên trong thực tế
- 5. Sử dụng thực tế cờ bit trong .NET framework
- 6. UITableView dequeueReusableCellWithIdentifier Lý thuyết
- 7. Tài nguyên để tìm hiểu lý thuyết danh mục
- 8. Xử lý nhiều bảng thực tế trong Qlikview
- 9. Lý thuyết mảng SMTLIB lẻ trong Z3
- 10. Đề can vật lý thực tế
- 11. Hiểu String^trong C++ .Net
- 12. Hiểu BDD với một ví dụ thực tế
- 13. Vượt qua id, nhưng không hiển thị nó trong url thực tế
- 14. ImageView hiển thị trong cách bố trí nhưng không phải trên thiết bị thực tế
- 15. Sử dụng hợp lý luồng trong C#?
- 16. Lý thuyết loại: loại các loại
- 17. Có phải "xấu" khi sử dụng try-catch để kiểm soát luồng trong .NET không?
- 18. Bản vẽ đa luồng trong .NET?
- 19. Quản lý không gian tên thích hợp trong .NET XmlWriter
- 20. Lý thuyết mô phỏng NES cơ bản - Tôi bị kẹt
- 21. Symfony2 subquery trong Học thuyết quản lý tổ chức
- 22. Khi hiểu về ConfigurationManager trong .NET
- 23. đa xử lý hoặc luồng trong python?
- 24. Có ai giúp tôi hiểu luồng cho chương trình của tôi không?
- 25. Tôi có dữ liệu về deadlocks, nhưng tôi không thể hiểu tại sao chúng xảy ra
- 26. Dự án Darkstar có thực tế không?
- 27. Cách lấy MemoryStream từ luồng trong .NET?
- 28. Python biến xử lý, tôi không hiểu nó
- 29. Tôi cần nhiều ví dụ thực tế hơn Ninject
- 30. Làm thế nào tôi có thể thiết lập mối quan hệ xử lý trong .NET?