2013-04-24 48 views
5

Tôi muốn chạy các khởi tạo của một số đối tượng không đồng bộ, nhưng một số đối tượng phụ thuộc vào những đối tượng khác đang được khởi tạo. Và sau đó tất cả các đối tượng cần phải được khởi tạo trước khi phần còn lại của ứng dụng của tôi tiếp tục.Bạn có thể gọi Wait() trên một tác vụ nhiều lần không?

Có thể gọi Wait() trên một nhiệm vụ và sau đó gọi Wait() trên nó một lần nữa, hoặc như trong ví dụ của tôi WaitAll() trên một bộ sưu tập mà nó được bao gồm?

Dictionary<String, Task> taskdict = new Dictionary<String, Task>(); 

    taskdict.Add("Task1", 
     Task.Factory.StartNew(() => { 
     //Do stuff 
     })); 

    taskdict.Add("Task2", 
     Task.Factory.StartNew(() => { 
      taskdict[ "Task1" ].Wait(); 

     //Do stuff 

     })); 

     try { 
     Task.WaitAll(taskdict.Values.Convert<Task[ ]>()); 
     } 

Hoặc lần thứ hai Chờ()/WaitAll() không thành công?

Trả lời

18

Bạn chắc chắn nhất có thể đợi công việc hai lần. Bạn có thể chờ một công việc nhiều lần tùy thích mà không có phản ứng phụ tiêu cực. Bây giờ, nếu bạn đã chờ một nhiệm vụ trong cùng một chuỗi, nó sẽ được thực hiện, vì vậy các cuộc gọi trong tương lai sẽ chỉ trả về ngay lập tức vì không có gì để đợi, nhưng chắc chắn chúng sẽ không bị lỗi hoặc tạo ra không phù hợp các kết quả.

Lưu ý rằng nếu tác vụ không hoàn thành bình thường và thay vào đó bị hủy hoặc không thể hoàn thành do ngoại lệ bị ném thì gọi Wait sẽ lại ném ngoại lệ (mỗi lần bạn gọi Wait). Nếu Wait đang ném ngoại lệ cho bạn, có khả năng đó là lý do.

+1

Cảm ơn bạn đã trả lời rõ ràng. Và cho các chi tiết về xử lý ngoại lệ. Đó là một vấn đề quan trọng tôi phải xem xét. –

+0

@Servy nếu tôi muốn Nhiệm vụ chạy lại, chờ thứ hai. Làm thế nào tôi có thể làm mất hiệu lực kết quả nhiệm vụ? –

+0

@MerdanGochmuradov Bạn không thể. Đó không phải là cách nhiệm vụ hoạt động. – Servy