2011-08-29 19 views
7

Làm cách nào để sửa đổi mô hình chế độ xem MVVM Progress cho công việc đang được thực hiện trên một chuỗi nền?Thông báo tiến trình luồng nền trong MVVM?

Tôi đang tạo ứng dụng MVVM thực hiện tác vụ trên chuỗi nền, sử dụng Task.Factory.StartNew()Parallel.ForEach(). Tôi đang sử dụng this article làm hướng dẫn. Cho đến nay, mã của tôi trông như thế này:

Task.Factory.StartNew(() => DoWork(fileList, viewModel)); 

đâu fileList là một danh sách các tập tin được xử lý, và viewModel là mô hình điểm với Progress tài sản. Phương pháp DoWork() trông như thế này, cho đến nay:

private object DoWork(string[] fileList, ProgressDialogViewModel viewModel) 
{ 
    Parallel.ForEach(fileList, imagePath => ProcessImage(imagePath)); 
} 

Phương pháp ProcessImage() hiện xử lý hình ảnh thực tế. Thuộc tính Progress của mô hình xem được gắn với thanh tiến trình trong hộp thoại được hiển thị ngay trước khi quá trình nền bắt đầu.

Tôi muốn cập nhật mô hình chế độ xem Progress thuộc tính sau mỗi lần lặp lại tuyên bố Parallel.ForEach(). Tất cả những gì tôi cần làm là tăng giá trị tài sản. Làm thế nào để làm điều đó? Cảm ơn bạn đã giúp đỡ.

+0

'Tiến trình' chỉ là một int, float hoặc double? –

Trả lời

7

Vì thuộc tính là thuộc tính đơn giản (chứ không phải bộ sưu tập), bạn có thể đặt trực tiếp. WPF sẽ tự động xử lý marshaling cho thread UI.

Tuy nhiên, để tránh tình trạng cuộc đua, bạn cần xử lý việc tăng số lượt truy cập "đã hoàn tất" của mình một cách rõ ràng. Đây có thể là một cái gì đó như:

private object DoWork(string[] fileList, ProgressDialogViewModel viewModel) 
{ 
    int done; // For proper synchronization 
    Parallel.ForEach(fileList, 
     imagePath => 
     { 
      ProcessImage(imagePath)); 
      Interlocked.Increment(ref done); 
      viewModel.Progress = done; 
     } 
} 
+0

Và một lần nữa, cảm ơn Reed! Tôi dường như đang nói điều này rất nhiều! Đã chấp nhận và +1. –

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