Tôi có một phương pháp async
đó là một phương pháp lâu dài mà đọc một dòng suối và khi nó tìm thấy một cái gì đó cháy một sự kiện:Chuyển đổi một phương pháp async trở IObservable <>
public static async void GetStream(int id, CancellationToken token)
Phải mất một mã thông báo hủy bỏ vì nó được tạo ra trong một nhiệm vụ mới. Bên trong nó gọi await
khi nó đọc một dòng:
var result = await sr.ReadLineAsync()
Bây giờ, tôi muốn chuyển đổi này cho một phương thức trả về một IObservable <> vì vậy mà tôi có thể sử dụng với các phần mở rộng phản ứng. Từ những gì tôi đã đọc, cách tốt nhất để làm điều này là sử dụng Observable.Create
, và kể từ RX 2.0 bây giờ cũng hỗ trợ async tôi có thể nhận tất cả để làm việc với một cái gì đó như thế này:
public static IObservable<Message> ObservableStream(int id, CancellationToken token)
{
return Observable.Create<Message>(
async (IObserver<Message> observer) =>
{
Phần còn lại của mã bên trong là như nhau, nhưng thay vì bắn các sự kiện, tôi gọi số observer.OnNext()
. Nhưng, điều này cảm thấy sai. Đối với một điều tôi trộn CancellationTokens lên trong đó, và mặc dù thêm từ khóa async làm cho nó hoạt động, đây thực sự là điều tốt nhất để làm gì? Tôi gọi ObservableStream của tôi như thế này:
Client.ObservableStream(555404, token).ObserveOn(Dispatcher.CurrentDispatcher).SubscribeOn(TaskPoolScheduler.Default).Subscribe(m => Messages.Add(m));
Bạn nên hầu như không bao giờ sử dụng 'async void', chắc chắn không phải trong các phương pháp thư viện. – svick