Một chút thông tin cơ bản.
Tôi đang tìm hiểu ngăn xếp API Web và tôi đang cố gắng đóng gói tất cả dữ liệu dưới dạng đối tượng "Kết quả" với các tham số như Thành công và Mã lỗi.
Tuy nhiên, các phương thức khác nhau sẽ tạo ra các kết quả và mã lỗi khác nhau nhưng đối tượng kết quả thường sẽ được khởi tạo theo cùng một cách.
Để tiết kiệm thời gian và cũng để tìm hiểu thêm về các khả năng không đồng bộ / chờ đợi trong C #, tôi đang cố gắng bọc tất cả các phần thân phương thức của các hành động api web của mình trong một đại biểu hành động không đồng bộ nhưng bị vướng vào một chút ...
Cho các lớp sau:
public class Result
{
public bool Success { get; set; }
public List<int> ErrorCodes{ get; set; }
}
public async Task<Result> GetResultAsync()
{
return await DoSomethingAsync<Result>(result =>
{
// Do something here
result.Success = true;
if (SomethingIsTrue)
{
result.ErrorCodes.Add(404);
result.Success = false;
}
}
}
Tôi muốn viết một phương thức thực hiện một hành động trên một đối tượng Kết quả và trả về nó. Thông thường thông qua các phương pháp đồng bộ, nó sẽ là
public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
T result = new T();
resultBody(result);
return result;
}
Nhưng làm cách nào để chuyển đổi phương thức này thành phương thức không đồng bộ bằng cách sử dụng async / await?
Đây là những gì tôi đã thử:
public async Task<T> DoSomethingAsync<T>(Action<T, Task> resultBody)
where T: Result, new()
{
// But I don't know what do do from here.
// What do I await?
}
Stream.ReadAsync()
trong một phương thức, thì phương thức đó sẽ không đồng bộ và trả về một Task<T>
nơi T
mà bạn đã trả về là phương thức đồng bộ. Ý tưởng là theo cách này, mọi người gọi phương thức của bạn sau đó có thể "chờ đợi không đồng bộ" (tôi không biết thuật ngữ tốt cho việc này là gì) Stream.ReadAsync()
để hoàn thành bên dưới . Một phép ẩn dụ cho điều này bạn có thể sử dụng là async là "lây nhiễm" và lây lan từ I / O tích hợp cấp thấp sang mã khác có kết quả phụ thuộc vào I / O đã nói.
new
hiệnT
, tại sao phương pháp của bạn cần phải không đồng bộ? AFAIK trong mã sử dụng API không đồng bộ, bạn chỉ cần truyền bá tính chấtasync
từ các phương thức khác mà bạn sử dụng.