2010-04-13 22 views
5

Hãy xem xét tôi bị gỉ sét về chủ đề của các đại biểu không đồng bộ.Cách chính xác để Cháy và Quên một đại biểu không đồng bộ

Nếu tôi muốn gọi một phương thức không đồng bộ, theo kiểu lửa và quên, đây có phải là cách thích hợp để thực hiện không?

Action action = DoSomething; 
action.BeginInvoke(action.EndInvoke, null); 

Phương thức DoSomething() bắt tất cả ngoại lệ và giao dịch với nội bộ.

Cuộc gọi đến EndInvoke có phù hợp không? Cần thiết?

Có cách nào rõ ràng hơn để đạt được cùng một hành vi không?

Trả lời

4

Các "cũ-học" cách trong .NET 3.5 là sử dụng ThreadPool:

ThreadPool.QueueUserWorkItem(s => DoSomething()); 

Nếu bạn muốn sử dụng các đại biểu không đồng bộ, khi đó bạn nên biết rằng cuộc gọi tới EndInvoke cần thiết, ngay cả khi bạn không có bất kỳ mã bổ sung nào bạn muốn thực thi khi gọi lại.

+1

Một dòng của bạn đánh bại hai của tôi. –

9

Cách mới (trong .NET 4) là để làm điều này:

Task.Factory.StartNew(() => DoSomething()); 
+2

Điều gì về xử lý đối tượng Task? Tôi muốn được quan tâm đến ý kiến ​​của bạn về [câu hỏi này] (http://stackoverflow.com/q/3734280/119738) –

5

Cần lưu ý rằng Task.Factory.StartNew(() => DoSomething()); không tuân thủ bất kỳ ngoại lệ tiềm năng nào được ném bởi phương pháp DoSomething. Tôi biết đây là những gì người ta muốn khi bắt đầu một hoạt động lửa-và-quên, nhưng như xa như .Net 4 là có liên quan, bất kỳ nhiệm vụ với một ngoại lệ unobserved được hoàn thành bởi thu gom rác sẽ leo thang như một ngoại lệ unhandled sẽ giết chết quá trình của bạn . Tuy nhiên, trong .Net 4.5, hành vi mặc định đã thay đổi (xem async & đang chờ từ khoá).

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