Điều đó phụ thuộc một chút vào khi bạn muốn các lỗi được nâng lên - tức là hăm hở, hoặc là một phần của các awaitable. Như với khối iterator, nếu bạn muốn kiểm tra lỗi háo hức, bạn cần hai phương pháp, ví dụ:
public Task<int> SomeMethod(..args..) {
if(..args fail..) throw new InvalidOperationException(...);
return SomeMethodImpl(...args...);
}
private async Task<int> SomeMethodImpl(...args...)
{
... await etc ...
}
này sau đó sẽ thực hiện bất kỳ tranh luận kiểm tra như là một phần của cuộc gọi ban đầu, không phải là awaitable. Nếu bạn muốn các ngoại lệ là một phần của các awaitable, bạn chỉ có thể ném nó:
public async Task<int> SomeMethod(..args..) {
if(..args fail..) throw new InvalidOperationException(...);
... await etc ...
}
Tuy nhiên, trong ví dụ của bạn, thực tế là bạn đang return
ing một Task
gợi ý rằng đây không phải là thực sự là một phương pháp async
, nhưng là một phương thức async (nhưng không phải là async
). Bạn không thể chỉ làm:
return new Task(() => { throw new ArgumentNullException("argument"); });
vì điều đó Task
sẽ không bao giờ được bắt đầu - và sẽ không bao giờ xảy ra. Tôi nghi ngờ bạn sẽ cần phải làm điều gì đó như:
try {
throw new InvalidArgumentException(...); // need to throw to get stacktrace
} catch(Exception ex) {
var source = new TaskCompletionSource<int>();
source.SetException(ex);
return source.Task;
}
đó là ... một chút của một mouthful và có lẽ có thể được gói gọn một chút tốt hơn. Điều này sẽ trả về một số Task
cho biết nó ở trạng thái Faulted
.
Nguồn
2013-09-06 11:22:34
Khung mục tiêu là 4.0 nên tôi không sử dụng không đồng bộ và đang chờ từ khóa – Demarsch
Tùy chọn thứ hai nên được viết là Task.Factory.StartNew (() => {throw ...}); Cập nhật nó trong câu hỏi – Demarsch
@Demarsch chỉ cần thêm [Microsoft.Bcl.Async] (https://www.nuget.org/packages/Microsoft.Bcl.Async) và 'async' /' await' sẽ hoạt động tốt –