2017-02-15 11 views
5

Hãy nói rằng tôi có một phương pháp mà các cuộc gọi một phương pháp async ngay lập tức hoặc tương tự:Phương thức async pass-through có thực sự cần mẫu await/async không?

//Main method 
public async Task<int> Foo1(int x) 
{ 
    var result = await DoingSomethingAsync(x); 
    return DoSomethingElse(result); 
} 
//other method 
public async Task<int> Foo2(Double double) 
{ 
    return await Foo1(Convert.ToInt32(double)); 
} 

Có bất kỳ lý do cụ thể mà Foo2 nhu cầu/nên có async/chờ đợi, như trái ngược với chỉ đơn giản gọi:

//other method 
public Task<int> Foo3(Double double) 
{ 
    return Foo1(Convert.ToInt32(double)); 
} 

trong một người tiêu dùng, điều này sẽ vẫn được chờ đợi, likeso, không phân biệt:

int x = await Foo1(1); 
int x = await Foo2(1D); 
int x = await Foo3(1D); 

Tất cả các báo cáo sẽ biên dịch. Trình biên dịch sẽ tạo ra các IL khác nhau cho hai phương pháp khác nhau?

Trả lời

6

Điều đó tùy thuộc. Cụ thể, hành vi ngoại lệ khác nếu Convert.ToInt32 ném.

Tôi có toàn bộ blog post on the subject, nhưng tóm lại, tôi sẽ sử dụng async/await tại đây vì ngoại lệ sẽ được đặt vào tác vụ trả lại. Nếu không, ngoại lệ sẽ được ném trực tiếp.

Trực tiếp ném ngoại lệ chỉ chấp nhận được đối với trường hợp ngoại lệ điều kiện tiên quyết (nghĩa là vi phạm API để vượt qua số double không thể chuyển đổi thành int). Và thậm chí sau đó (đối với trường hợp ngoại lệ điều kiện tiên quyết), bạn có thể chọn hoặc ném ngoại lệ trực tiếp hoặc đặt chúng vào tác vụ được trả lại.

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