2017-03-08 16 views
5

C# 7 là ra ngoài và tôi thấy họ đã mở ra các asyncchờ từ khóa để cho phép bất cứ điều gì bạn muốn. Tuy nhiên diện tích bề mặt của API có vẻ như very large và tôi không chắc chắn về những hạn chế đó. Cụ Tôi quan tâm nếu điều này là có thểVới sự hỗ trợ TaskLike async mới C# 7.0 là nó có thể viết một IObservable <T> phát

int RandomNumber(){..} 

public async IObservable<int> Generate(){ 
    while(true){ 
     await Observable.Timer(TimeSpan.FromSeconds(1)).Select(_=>RandomNumber()); 

     await Observable.Timer(TimeSpan.FromSeconds(2)).Select(_=>10); 
    } 
} 

mà tôi nghĩ là tương đương với

public IObservable<int> Generate(){ 
    return Observable.Timer(TimeSpan.FromSeconds(1)).Select(_=>RandomNumber()) 
    .Concat(Observable.Timer(TimeSpan.FromSeconds(2)).Select(_=>10)) 
    .Replay(); 

} 

Có một liên kết trên Reddit from a while trước thảo luận về lý do tại sao async chờ đợi có thể mạnh mẽ như f biểu thứC# tính toán nếu chỉ họ được cho phép.

Trả lời

0

Tôi đoán là không (hiện tại):

Trình biên dịch phải bằng cách nào đó kết hợp mã của bạn thành một loại cụ thể để xây dựng và trả về. IObservable<T> không phải là một loại, do đó trình biên dịch không thể xây dựng nó.

Ngoài ra, từ 7.0 Release Notes:

Tính năng ngôn ngữ mới có nghĩa là phương pháp async có thể trở lại loại khác ngoài công tác, nhiệm vụ và hiệu lực. Kiểu trả về phải vẫn đáp ứng mẫu không đồng bộ, có nghĩa là phương thức GetAwaiter phải là có thể truy cập được.

Điều đó không có nghĩa là ai đó không thể xây dựng ObservableTask<T> hoặc thứ gì đó sẽ triển khai IObservable<T> và cũng đáp ứng các yêu cầu của API tác vụ. Nó chưa được thực hiện (chưa).

Bạn vẫn gặp sự cố không khớp: Task<T> xoay quanh trả lại đối tượng 0-1 T, IObservable<T> trả về 0-n T đối tượng.

Các vấn đề liên quan