2009-04-28 33 views
6

Chúng tôi có một ứng dụng máy tính để bàn thực hiện một bộ tính toán khá nghiêm ngặt trong một chuỗi nền. Các phần của phép tính này được thực hiện trong một thư viện không được quản lý mà chúng ta truy cập thông qua interop. Những gì chúng tôi đang tìm kiếm là, khi chúng tôi bắt đầu tính toán, chuỗi giao diện người dùng không phản hồi trong suốt thời gian tính toán. Chúng tôi đã được ấn tượng rằng khuôn khổ sẽ xử lý các thread chuyển đổi để cho phép giao diện người dùng để tiếp tục được đáp ứng, nhưng đó không phải là trường hợp. Chúng tôi đã tìm thấy rằng chúng tôi có thể chèn một Thread.Sleep (0) hoặc Application.DoEvents() để cho phép giao diện người dùng được đáp ứng. Điều này có tác dụng phụ làm chậm tính toán. Ngoài ra, các phần của phép tính được thực hiện bởi mã không được quản lý có thể mất tối đa 30 giây để hoàn thành và trong thời gian này, ứng dụng luôn không phản hồi. Toàn bộ phép tính có thể mất từ ​​2 đến 5 phút để hoàn thành..NET Threading Model và Application.DoEvents vs. Thread.Sleep

Điều này dẫn đến các câu hỏi sau:

  • mô hình luồng NET framework liên quan đến giao diện người dùng và interop với là gì?
  • Chúng tôi có sai khi giả định rằng khung công tác phải xử lý chuyển đổi luồng giữa chủ đề nền và giao diện người dùng?
  • Sự khác nhau giữa việc sử dụng Thread.Sleep và Application.DoEvents trong trường hợp này là gì và được ưu tiên hơn cái kia?
+0

LƯU Ý: rất cũ Q & A; tìm kiếm các cuộc thảo luận mới hơn để có được câu trả lời hay về các giải pháp hiện có. – ToolmakerSteve

Trả lời

2

Bạn có thể giảm mức độ ưu tiên của chuỗi nền của mình, vì vậy nó sẽ được hệ điều hành ưu tiên hơn. Nếu bạn có một số kiến ​​thức miền dẫn bạn muốn kiểm soát khi nó được preempted, bạn có thể đi với Thread.Sleep (0) mà đầu hàng timeslice của bạn nếu có một thread chờ đợi.

Application.DoEvents bơm hàng đợi thông báo của cửa sổ. Điều này sẽ khiến ứng dụng của bạn phản hồi các sự kiện như tổ hợp phím hoặc thay đổi kích thước cửa sổ. Thread.Sleep sẽ làm cho thread của bạn được preempted (hoặc có thể không, trong trường hợp Thread.Sleep (0)).

Cũng đọc Threading in C#

0

Cách thích hợp để làm điều này là bằng cách sử dụng callbacks, mặc dù. Xem mô hình Silverlight của việc sử dụng các phương thức không đồng bộ (ví dụ để lấy dữ liệu dịch vụ web). Tôi biết câu hỏi này là "trả lời" nhưng câu trả lời không phải là IMHO lý tưởng.

2

Đặt cược tốt nhất của bạn là tạo ra Thread của riêng bạn. DoEventsThread.Sleep(0) chặn tính toán, làm chậm quá trình tính toán. Bạn có thể bao bọc các cuộc gọi DLL của mình trong một đại biểu ThreadStart hoặc một đại biểu ParameterizedThreadStart và sử dụng tên đại biểu làm thông số khi bạn khởi tạo Thread. Từ đó, tất cả những gì bạn phải làm là gọi phương thức Start của Thread.