Ok, về cơ bản tôi có một loạt các nhiệm vụ (10) và tôi muốn bắt đầu tất cả chúng cùng một lúc và đợi chúng hoàn thành. Khi hoàn thành tôi muốn thực hiện các nhiệm vụ khác. Tôi đọc một loạt các nguồn lực về vấn đề này nhưng tôi không thể làm cho nó phù hợp với trường hợp cụ thể của tôi ...Thực hiện các tác vụ song song
Dưới đây là những gì tôi đang có (mã đã được đơn giản hóa):
public async Task RunTasks(){
var tasks = new List<Task>
{
new Task(async() => await DoWork()),
//and so on with the other 9 similar tasks
}
Parallel.ForEach(tasks, task =>
{
task.Start();
});
Task.WhenAll(tasks).ContinueWith(done=>{
//Run the other tasks
});
}
//This function perform some I/O operations
public async Task DoWork(){
var results = await GetDataFromDatabaseAsync();
foreach(var result in results){
await ReadFromNetwork(result.Url);
}
}
Vì vậy, vấn đề của tôi là khi tôi chờ đợi các tác vụ hoàn thành với cuộc gọi WhenAll
, nó cho tôi biết rằng tất cả các tác vụ đều kết thúc mặc dù không có tác vụ nào được hoàn thành. Tôi đã thử thêm Console.WriteLine
vào số foreach
và khi tôi đã nhập tác vụ tiếp tục, dữ liệu tiếp tục đến từ Task
giây trước đó của tôi chưa thực sự hoàn tất.
Tôi đang làm gì sai ở đây?
Tôi nghi ngờ trong tất cả điều này, bạn có một 'Task' ở đâu đó (gọi hàm dựng trực tiếp là phần nghi ngờ) và bạn thực sự muốn chờ nhiệm vụ bên trong. Bạn có thể sử dụng 'Task.Run' thay vì khởi tạo Task/Start không? 'Task.Run' sẽ thực hiện phần mở rộng cho bạn. –
Vì vậy, bạn nghĩ mình nên làm: var nhiệm vụ = new List { Task.Run (() => DoWork()) } –