2015-05-30 17 views
8

Giả sử tôi có một lớp học Repository có số DbContext. Trong lớp này, tôi có một phương pháp:Khi nào bạn nên đợi Nhiệm vụ?

public async Task<T> CreateAsync(T obj) 
{ 
    var o = _dbSet.Add(obj); 
    await _dbContext.SaveChangesAsync(); 
    return o; 
} 

trong một lớp Service tôi sử dụng phương pháp này để tạo ra một đối tượng:

public async Task<MyObject> Create() 
{ 
    return await _repository.CreateAsync(new MyObject()); 
} 

Và cuối cùng trong bộ điều khiển api tôi MyObjectController tôi trở về đối tượng này như sau:

public async Task<IHttpActionResult> Get() 
{ 
    return Ok(await _service.Create()); 
} 

Tôi nhầm lẫn về tất cả các từ khóa asyncawait này. Tôi biết rằng Task đang chờ. Điều này có nghĩa là tôi chỉ có thể trả lại số Task từ CreateAsync mà không phải chờ trong số CreateAsync hoặc Create và sau đó cuối cùng chờ nó trong Get? Liệu nó có tác động tiêu cực đến ứng dụng của tôi mà tôi đang chờ đợi của tôi như trong ví dụ này?

Trả lời

4

Điều này có nghĩa là tôi chỉ có thể trả lại Tác vụ từ CreateAsync mà không phải đợi trong cả CreateAsync hoặc Create và sau đó cuối cùng cũng chờ trong Get?

có bạn có thể làm điều đó, nó thực sự hiệu quả hơn. nếu bạn đang chờ đợi khi bạn đang thực hiện chúng, mỗi phương pháp không đồng bộ sẽ tạo ra một máy trạng thái có nghĩa là nhiều mã hơn và nhiều ngữ cảnh chuyển đổi hơn

Nó có tác động tiêu cực đến ứng dụng của tôi mà tôi đang chờ đợi như trong thí dụ?

Sẽ có một hình phạt hiệu suất nhỏ do máy trạng thái và chuyển ngữ cảnh. Chi phí thường ít hơn nhiều so với chi phí của cuộc gọi, nhưng tất cả đều tăng lên cuối cùng. Async Performance: Understanding the Costs of Async and Await là một bài viết tuyệt vời về chủ đề này.

Như được chỉ ra bởi @Richard Szalay, chỉ cần đảm bảo rằng bạn cuối cùng là await tác vụ nếu không thì bất kỳ ngoại lệ nào xảy ra sẽ vẫn không được giám sát và sẽ bị nuốt chửng.

+0

Nó đáng chú ý là nhược điểm để trả lại một công tác mà không cần chờ nó là phương thức được đề cập sẽ không nằm trong callstack async nếu ngoại lệ bị ném –

+0

Điểm tốt, nhưng anh ta đã nói rằng cuối cùng anh ta chờ nó trong phương thức 'Get' để ngoại lệ sẽ bị ném, nhưng tôi sẽ chỉ ra điều đó một cách rõ ràng. –

+0

ngoại lệ sẽ không bị nuốt, nhưng phương pháp không chờ đợi sẽ không xuất hiện trên callstack async (có thể làm cho mọi việc khó khăn hơn để gỡ lỗi) –

0

không đồng bộ và đang chờ được sử dụng khi bạn muốn phương thức chạy không đồng bộ. async mà không cần chờ đợi là một đồng bộ

phương pháp async trở lại nhiệm vụ hoặc khoảng trống chờ đợi cho nhiệm vụ để hoàn thành

để chờ đợi được sử dụng trước khi một phương pháp mà trở lại nhiệm vụ

phương pháp Nhận của bạn đang chờ để hoàn tất tác vụ create() chờ đợi để hoàn tất tác vụ createAsync

v.v.

_dbTiếp theo.SaveChangesAsync() là phương pháp async nên aaawait là cần thiết, hoặc nếu không nó có thể trở lại sai o

Hãy cho tôi biết nếu bạn cần bất kỳ làm rõ hơn

+0

Tôi khá chắc chắn OP biết những gì đang chờ đợi/asyn nào. Câu hỏi của ông giống như "Tôi có nên sử dụng nhiều chờ đợi và một người đang chờ đợi" –

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