gọi một hàm và không bao giờ đợi nó trong C #


26

Tôi có một bộ điều khiển trong ứng dụng web mvc4 của mình, trong đó có một hành động cần gọi một chức năng khác. Điều gì xảy ra trong hàm đó tức là giá trị trả về không quan trọng đối với hành động của tôi. Làm thế nào tôi có thể gọi chức năng đó và không bao giờ chờ đợi nó được thực thi?

Tôi nghĩ rằng nó có thể được thực hiện bằng async nhưng quan điểm của tôi là không sử dụng tài nguyên, chỉ gọi hàm và không bao giờ chờ đợi điều gì đã xảy ra.

Xin vui lòng cho tôi một số lời khuyên.



Cách duy nhất bạn có thể làm là bằng cách chuyển nó sang một chủ đề khác. Không có thứ gọi là chức năng mà không có tài nguyên, trừ khi bạn chỉ muốn nó là không hoạt động.
Robert Harvey

cảm ơn, ý tôi là cách tốt nhất và tối ưu hóa là gì, tôi nghĩ cách tốt nhất là Task.Run và sử dụng WebApi trong MVC, dựa trên liên kết @ user814064 đã đề cập, có lẽ tôi chỉ có thể sử dụng giải pháp javascript chuyên nghiệp!
dùng2675751

Câu trả lời:


40
private void Demo()
{
    // Do something, given that the result doesn't matter.
}

public void Do()
{
    Task.Factory.StartNew(this.Demo);

    // The following line will be executed without waiting for the result.
    DoSomethingElse();
}

Lưu ý rằng bắt đầu một phương pháp mà không quan tâm đến kết quả hoặc về các ngoại lệ mà nó có thể đưa ra là rủi ro.

Nếu một ngoại lệ được ném vào a Task, nó sẽ bị ẩn cho đến khi bạn:

  1. Quan sát kết quả,
  2. Wait() cho nhiệm vụ, hoặc:
  3. GC gọi bộ hoàn thiện trên Task.

Bạn có thể tự xử lý 1. và 2. ngay sau khi bạn gọi phương thức hoặc bạn có thể đính kèm phần tiếp theo myTask.OnComplete(myErrorHandler, TaskContinuationOptions.OnlyOnFaulted)để được chạy khi tác vụ ban đầu ném ngoại lệ. 3. sẽ làm hỏng quá trình của bạn; đừng làm vậy


3
Bạn có thể mở rộng trên "3. sẽ làm hỏng quá trình của bạn; đừng làm vậy". Điều này không được thực hiện tự động?
rdans
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.