Tôi có một số mã lặp qua danh sách các bản ghi, bắt đầu tác vụ xuất cho mỗi bản ghi và tăng số lượt truy cập tiến trình lên 1 lần mỗi khi tác vụ kết thúc để người dùng biết cách xử lý quá xa.Làm cách nào để theo dõi số lượng tác vụ không đồng bộ đã hoàn thành trong vòng lặp?
Nhưng tùy thuộc vào thời gian của vòng của tôi, tôi thường thấy đầu ra hiển thị số cao hơn trước số thấp hơn.
Ví dụ, tôi sẽ mong đợi để xem kết quả như thế này:
Exporting A Exporting B Exporting C Exporting D Exporting E Finished 1/5 Finished 2/5 Finished 3/5 Finished 4/5 Finished 5/5
Nhưng thay vào đó tôi nhận được kết quả như thế này
Exporting A Exporting B Exporting C Exporting D Exporting E Finished 1/5 Finished 2/5 Finished 5/5 Finished 4/5 Finished 3/5
Tôi không mong đợi đầu ra để được chính xác kể từ khi tôi m không khóa giá trị khi tôi cập nhật/sử dụng nó (đôi khi nó xuất ra cùng một số hai lần, hoặc bỏ qua một số), tuy nhiên tôi sẽ không mong đợi nó để đi ngược.
kiểm tra tập hợp dữ liệu của tôi là 72 giá trị, và mã liên quan như sau:
var tasks = new List<Task>();
int counter = 0;
StatusMessage = string.Format("Exporting 0/{0}", count);
foreach (var value in myValues)
{
var valueParam = value;
// Create async task, start it, and store the task in a list
// so we can wait for all tasks to finish at the end
tasks.Add(
Task.Factory.StartNew(() =>
{
Debug.WriteLine("Exporting " + valueParam);
System.Threading.Thread.Sleep(500);
counter++;
StatusMessage = string.Format("Exporting {0}/{1}", counter, count);
Debug.WriteLine("Finished " + counter.ToString());
})
);
}
// Begin async task to wait for all tasks to finish and update output
Task.Factory.StartNew(() =>
{
Task.WaitAll(tasks.ToArray());
StatusMessage = "Finished";
});
Sản lượng có thể xuất hiện ngược trong cả những điều khoản debug và StatusMessage
đầu ra.
Cách chính xác để đếm số lượng tác vụ không đồng bộ trong vòng lặp được hoàn thành để vấn đề này không xảy ra?
Bạn có chắc chắn rằng 'Async' Prcess được đảm bảo đầu ra trong một' tăng dần Order' Dựa trên những gì tôi Tôi không nghĩ rằng nó sẽ trừ khi bạn có thể làm một 'Sort' trên' List ' –
MethodMan
Vì bạn đang bắt đầu tất cả các nhiệm vụ cơ bản cùng một lúc, chúng sẽ kết thúc theo một thứ tự ngẫu nhiên. Ngay cả khi bạn sử dụng Interlocked.Increment "Finished n/5" sẽ không đơn điệu. – Phil
@DJKRAZE Biến 'counter' không thực sự được tăng lên cho đến khi quá trình xuất hoàn tất (Thay thế bằng' Thread.Sleep' cho mục đích thử nghiệm). Xuất khẩu khác nhau mất nhiều thời gian khác nhau để hoàn thành tùy thuộc vào bao nhiêu dữ liệu mà chúng chứa, vì vậy tôi không muốn giá trị được xác định trước khi bắt đầu tác vụ không đồng bộ. Thay vào đó, tôi đang cố gắng sử dụng biến được chia sẻ được tăng thêm 1 bất kỳ lúc nào mọi tác vụ xuất hoàn tất. – Rachel