2010-08-03 35 views
11

Hiện tại, tôi đang xử lý sự cố khi tôi phải gửi rất nhiều chức năng đến một chuỗi khác để ngăn chặn chức năng hiện tại chặn. bây giờ tôi tự hỏi cách nhanh nhất là thực hiện nhiệm vụ này là gì.Cách nhanh nhất để thực thi phương thức không đồng bộ?

hiện Tôi đang mắc kẹt với

ThreadPool.UnsafeQueueUserWorkItem 

như hơi nhanh hơn của nó so với QueueUserWorkItem thường xuyên. tuy nhiên, tôi sợ rằng threadpool có thể chặn điều này ở đây. có cách nào nhanh hơn để gửi một cuộc gọi phương thức đến một chủ đề khác không? tôi tự hỏi thực hành tốt nhất là gì cho một nhiệm vụ như vậy? mã không an toàn sẽ là không có vấn đề vì nó trong một kịch bản mà đã có rất nhiều interop được sử dụng. cảm ơn j.

+4

Khi bạn nói 'nhanh hơn' làm bạn có nghĩa là bạn muốn giảm bớt chặn trên thread 'chính'? Cụ thể, cuộc gọi xếp hàng để xử lý nền trả về càng nhanh càng tốt? –

+0

WRT mối quan tâm của bạn, threadpool không chặn cho cuộc gọi đó (hoặc bình thường 'an toàn'), nhưng nó trả về một bool cho dù nó đã xếp hàng thành công, với lý thuyết là nếu nó trả về false, bạn có thể muốn thực hiện nó trên chuỗi hiện tại hoặc thử lại sau hoặc bất kỳ điều gì. –

+0

Bạn có gửi đi cùng một phương pháp mỗi lần không? Họ có cần phải hoạt động không đồng bộ với nhau không? Cách tiếp cận của nhà sản xuất/người tiêu dùng có được chấp nhận không? (vì vậy người gọi chỉ cần thêm thứ gì đó vào hàng đợi). Phiên bản .NET nào được bật? –

Trả lời

2

CLR (4) nhóm khuyến cáo:

Nhiệm vụ bây giờ là cách ưa thích để xếp hàng làm việc với các hồ bơi thread.

Đọc CLR 4.0 ThreadPool Improvements: Part 1New and Improved CLR 4 Thread Pool Engine để biết thông tin chi tiết. Tóm lại, lý do là: hàng đợi địa phương, đề tài sử dụng lại, trộm cắp công việc. Basiclly cho mục tiêu cân bằng tải.

Extras:

Tôi không hiểu tại sao nó không phải là câu trả lời (bị bỏ phiếu).

Bạn đã viết

tôi phải cử địa ngục rất nhiều chức năng để thread khác để ngăn chặn chức năng hiện tại từ chặn"

Tôi trả lời: Một số TPL (tồn tại cho net35) 'block' (bộ sưu tập đồng thời, nguyên mẫu quay vv) được thiết kế đặc biệt để truy cập đồng thời cao, với trọng tâm giảm thiểu hoặc loại bỏ chặn cho hiệu quả ient quản lý công việc. Bạn có thể sử dụng các khối đó (ví dụ: - BlockingCollection cho vấn đề của bạn). TPL được thiết kế để tạo và xử lý hàng trăm (hoặc thậm chí hàng nghìn) hoạt động cpu/io-bound (nhiệm vụ) với chi phí tối thiểu (hoặc hàng triệu với sự trợ giúp của PLinq).

Bạn hỏi:

tôi chỉ tự hỏi những gì các thực hành tốt nhất là dành cho một nhiệm vụ như vậy?

Tôi đã trả lời: thực hành tốt nhất - TPL (lập luận, không chỉ là đề nghị của tôi)

+0

+ Tiện ích bổ sung. Vui lòng thêm nhận xét nếu giảm giá – SalientBrain

1

Chèn nhiều mục hoặc lớn hơn cùng một lúc sẽ giảm chi phí.

Chỉnh sửa sau khi đọc một trong những bình luận của bạn:

tôi đã trải qua những điều tương tự. Cách khắc phục thông thường của tôi không phải là gửi đi mọi yêu cầu không đồng bộ ngay lập tức mà là bắt chước những gì Nagle's Algorithm làm cho TCP.

Ở đây, khi nhận được Yêu cầu(), bạn sẽ gửi ngay lập tức nếu không có công việc không đồng bộ nào đang chờ xử lý. Nếu công việc không đồng bộ đang chờ xử lý, bạn sẽ chỉ gửi đi nếu một số mili giây nhất định kể từ khi Yêu cầu không gửi đi sớm nhất đã trôi qua hoặc một số lượng Yêu cầu() đã tồn đọng đã tích lũy.

Đây là một mẫu hiệu quả để giảm chi phí khi nhận được yêu cầu thường xuyên() mà bạn không có quyền kiểm soát. Hy vọng rằng sẽ giúp.

+0

Nó sẽ không làm việc chống lại tiền đề của OP rằng mục đích là để gửi rất nhanh. Việc thực hiện của người tiêu dùng không quan trọng đối với nhà sản xuất. Trong trường hợp này, kiểu đệm của Nagle có thể không hữu ích phải không? – Gangadhar

+0

"công văn rất nhanh" là mơ hồ. Một thuật toán Nagle đảm bảo độ trễ hợp lý thấp và mặc dù rất tốt. Đó là những gì tôi gọi là công văn nhanh mặc dù chúng ta hãy nghe OP. –

0

Có thể bạn có thể ném tất cả yêu cầu gửi của bạn vào Danh sách <> và đánh thức một chuỗi nền khác để thực hiện cuộc gọi đến QueueUserWorkItem.

Tôi có hiểu vấn đề chính xác không?

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