Đây là một trong những kết quả tìm kiếm hàng đầu của tôi và vẫn không có ví dụ cho sự tiến bộ trong Task Parallel Library
ngay tại đây ...
Hôm nay tôi chỉ đi qua TPL vì tôi muốn phát triển ứng dụng đa luồng mới nhưng mà không sử dụng BackgroundWorker
(vì tôi đọc một nơi nào đó về nhiệm vụ với mã tốt trước đây)
Tôi biên dịch ví dụ từ câu trả lời @Stephen Cleary, liên kết của anh ấy khá phức tạp để tìm kiếm tiến trình và một số trang web khác.
Đây là ví dụ rất đơn giản để làm thế nào để làm Progress và Hoàn với thread UI cách an toàn:
TaskScheduler currentTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
Task<string>.Factory.StartNew(() =>
{
// loop for about 10s with 10ms step
for (int i = 0; i < 1000; i++)
{
Thread.Sleep(10);
Task.Factory.StartNew(() =>
{
// this is a task created each time you want to update to the UI thread.
this.Text = i.ToString();
}, CancellationToken.None, TaskCreationOptions.None, currentTaskScheduler);
}
return "Finished!";
})
.ContinueWith(t =>
{
// this is a new task will be run after the main task complete!
this.Text += " " + t.Result;
}, currentTaskScheduler);
Mã này sẽ hiển thị 1-1000 trong vòng 10s và sau đó nối thêm một "Hoàn tất! " chuỗi trong thanh tiêu đề biểu mẫu cửa sổ. Bạn có thể thấy rằng TaskScheduler là cách khôn lanh để tạo cập nhật an toàn giao diện người dùng bởi vì tôi nghĩ rằng nhiệm vụ được lên lịch để chạy trên chủ đề chính.
bất kỳ giải pháp cuối cùng nào có mã nguồn đầy đủ? – Kiquenet