Tôi có một giao diện với một số chức năng không đồng bộ.
Task
Tôi tin rằng các phương pháp quay trở lại . async
là một chi tiết triển khai, vì vậy nó không thể được áp dụng cho các phương thức giao diện.
Một số lớp triển khai giao diện không có bất cứ thứ gì để chờ đợi, và một số có thể chỉ ném.
Trong những trường hợp này, bạn có thể tận dụng thực tế async
là chi tiết triển khai.
Nếu bạn không có gì để làm await
, thì bạn có thể quay lại Task.FromResult
:
public Task<int> Success() // note: no "async"
{
... // non-awaiting code
int result = ...;
return Task.FromResult(result);
}
Trong trường hợp ném NotImplementedException
, thủ tục hơi dài dòng hơn một chút:
public Task<int> Fail() // note: no "async"
{
var tcs = new TaskCompletionSource<int>();
tcs.SetException(new NotImplementedException());
return tcs.Task;
}
Nếu bạn có nhiều phương thức ném NotImplementedException
(bản thân nó có thể chỉ ra rằng một số cấu trúc lại ở mức thiết kế sẽ tốt), thì bạn có thể kết hợp wordiness thành một lớp trợ giúp:
public static class TaskConstants<TResult>
{
static TaskConstants()
{
var tcs = new TaskCompletionSource<TResult>();
tcs.SetException(new NotImplementedException());
NotImplemented = tcs.Task;
}
public static Task<TResult> NotImplemented { get; private set; }
}
public Task<int> Fail() // note: no "async"
{
return TaskConstants<int>.NotImplemented;
}
Lớp trợ giúp cũng giảm rác mà GC nếu không sẽ phải thu thập, vì mỗi phương thức có cùng kiểu trả về có thể dùng chung các đối tượng Task
và của nó NotImplementedException
.
Tôi có một số ví dụ về loại "hằng số tác vụ" khác trong thư viện AsyncEx của mình .