2012-03-31 46 views
7

Trong ứng dụng WPF của tôi, tôi đang tải nội dung bằng cách sử dụng Dispatcher.BeginInvoke trong hàm tạo. Câu hỏi của tôi là nó sẽ chặn luồng UI?Sự khác biệt giữa Dispatcher.BeginInvoke và Task.Factory.StartNew

Hoặc tốt hơn là sử dụng Task.Factory.StartNew và sau đó gửi mọi thứ trở lại giao diện người dùng để ứng dụng sẽ tải đầu tiên bất kể thời gian tải nội dung?

Cách tiếp cận nào tốt hơn và tại sao?

Trả lời

20

Họ làm hai việc rất khác nhau:

  • Task.Factory.StartNew lịch một đại biểu để thực hiện trên một thread hồ bơi. Chuỗi hiện tại tiếp tục chạy mà không cần đợi kết quả của tác vụ này (không đồng bộ). Thông thường bạn sẽ sinh ra một nhiệm vụ nền chạy dài hơn để giao diện người dùng không bị chặn quá lâu (không phải "đông lạnh").

  • Dispatcher.BeginInvoke lập lịch biểu cho một đại biểu thực hiện trên luồng giao dịch (UI). Thông thường, điều này được thực hiện để cập nhật một số giao diện người dùng với kết quả của một số thao tác được thực hiện trên chuỗi nền . Về cơ bản bạn đang cập nhật giao diện người dùng tại đây.

Để trả lời bạn những câu hỏi trực tiếp:

Bạn không nên lên kế hoạch hoạt động dài trên thread dispatcher, thường bạn chỉ muốn cập nhật giao diện điều khiển ở đây. Mã trong đại biểu sẽ được thực hiện trên luồng giao diện người dùng, bị chặn trong thời gian thực thi. Chỉ cần đặt Thread.Sleep(10000) vào mã hiện tại của bạn (bạn lập biểu từ trình tạo) và bạn sẽ thấy giao diện người dùng sẽ bị đóng băng. Sử dụng tác vụ nền cho việc này - hoặc với một Task hoặc nhân viên nền (cả hai đều sẽ sử dụng một chuỗi chủ đề luồng).

Hoặc là nó tốt hơn để sử dụng Task.Factory.StartNew và sau đó cử mọi thứ trở lại trên giao diện người dùng để ứng dụng sẽ được tải đầu tiên không phân biệt thời gian quá trình tải nội dung.

Có!

+0

Cảm ơn bạn đã trả lời, sẽ Dispatcher.BeginInvoke chặn UI..trong ứng dụng của tôi. tôi cần phải gọi một số dịch vụ trong khi tải và nếu dịch vụ được dừng lại sau đó nó treo UI mặc dù tôi đã sử dụng Dispatcher.BeginInvoke vì vậy câu hỏi cơ bản của tôi là sử dụng dispatcher hoặc nhiệm vụ trong trường hợp này? –

+2

nếu bạn muốn một cái gì đó đang chạy trong nền * sử dụng một tác vụ, nếu bạn muốn gửi kết quả đến giao diện người dùng sử dụng 'Dispatcher.BeginInvoke' – BrokenGlass

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