Существует два основных способа преобразования Задачи в Наблюдаемую, с важным отличием между ними.
Observable.FromAsync(()=>GetProductAsync("test"));
и
GetProductAsync("test").ToObservable();
Первый не запустит Задачу, покаВы подписываетесь на это.Второй создаст (и запустит) задачу, и результат будет немедленно или через некоторое время отображаться в наблюдаемой, в зависимости от того, насколько быстро задача.
Хотя, глядя на ваш вопрос в целом, кажется, что выхотите остановить поток вызовов. Вы не хотите ограничивать поток результатов, что приведет к ненужным вычислениям и потере.
Если это ваша цель, ваш GetProductAsync может бытьрассматривается как наблюдатель событий вызова, и GetProductAsync должен регулировать эти вызовы.Одним из способов достижения этого было бы объявить
public event Action<string> GetProduct;
и использовать
var callStream= Observable.FromEvent<string>(
handler => GetProduct+= handler ,
handler => GetProduct-= handler);
Тогда возникает проблема, как вернуть результат и что должно произойти, когда вызов вашего вызывающего абонентаограничены и отброшены.
Один из подходов может заключаться в объявлении типа «GetProductCall», который будет иметь входную строку и выходной результат в качестве свойств.
После этого вы можете получить такую настройку, как:
var callStream= Observable.FromEvent<GetProductCall>(
handler => GetProduct+= handler ,
handler => GetProduct-= handler)
.Throttle(...)
.Select(r=>async r.Result= await GetProductCall(r.Input).ToObservable().FirstAsync());
(код не проверен, только иллюстративный)
Другой подход может включать перегрузку Merge (N), которая ограничиваетмаксимальное количество одновременных наблюдаемых.