Tôi đang cố gắng tìm cách thực hành tốt nhất cho một trong các dự án của tôi. Nó là một ứng dụng WPF điển hình với một giao diện người dùng hiển thị một danh sách các mục và có một dịch vụ dữ liệu trả về kết quả.Async đang chờ vs GetAwaiter(). GetResult() và gọi lại
Chúng tôi đang gọi dịch vụ không đồng bộ để không chặn giao diện người dùng. Chúng tôi có 2 lựa chọn trước mặt chúng tôi:
Sử dụng Async chờ từ khóa Điều này đòi hỏi đánh dấu tất cả các phương pháp async từ nút bấm tất cả các cách để phục vụ lớp (class về phía khách hàng mà làm cho các cuộc gọi http đến máy chủ) và bất kỳ phương pháp nào ở giữa. Cách tiếp cận này hoạt động tốt khác sau đó vấn đề tuyên truyền async ở khắp mọi nơi
Sử dụng awaiter và gọi lại Trong phương pháp này, trình khách UI gọi lớp dịch vụ và chuyển một cuộc gọi lại đến lớp dịch vụ, lớp dịch vụ kết thúc cuộc gọi http đến máy chủ trong một nhiệm vụ và sử dụng GetAwaiter() GetResult(), khi cuộc gọi http được hoàn thành, nó sẽ gọi lại cuộc gọi được truyền bởi trình khách UI. Trong trường hợp này, không có phương pháp nào được đánh dấu là không đồng bộ, nhưng không thực sự chắc chắn về việc sử dụng GetAwaiter()
Task.Run (async() => // await http call, gọi lại gọi lại) .GetAwaiter(). GetResult ();
Tôi chỉ cố gắng để tìm hiểu đó là một cách tiếp cận tốt hơn và nếu có một số vấn đề với một trong hai phương pháp mà tôi cần phải nhận thức
Tôi khá chắc chắn cách tiếp cận thứ hai có thể dẫn đến khóa chết một lần trong một thời gian. Tôi biết vì tôi đã đối mặt với một cái gì đó giống nhau khi phát triển với Windows Universal. – Felype
Ngoài ra còn có câu hỏi về ngoại lệ. Tôi biết với một thực hiện async đầy đủ, bạn nhận được 'AggregateException' ở cuối, nhưng tôi không biết điều gì sẽ xảy ra với các ngoại lệ trong phương thức' GetAwaiter' – Eris
@Eris Khi bạn chờ đợi bạn không nhận được 'AggregateException'. Bạn nhận được ngoại lệ bên trong. Điều tương tự cũng xảy ra với 'GetResult'. – i3arnon