c# - 来自 *Async 方法的 IObservable 序列

标签 c# async-await system.reactive

我有一个源元素列表 Foo , 和一个异步方法 GetBoosAsync()将它们转换为 Boo 类型的元素:

public class Foo
{
    public string Value { get; set; }
}

public class Boo
{
    public string Value { get; set; }
}

static void Main(string[] args)
{
    IReadOnlyCollection<Foo> foos = GetFoos();

    Task<IReadOnlyCollection<Boo>> boosTask = GetBoosAsync(foos);

    boosTask.Wait();

    foreach (Boo boo in boosTask.Result)
    {
        Console.WriteLine(boo.Value);
    }

    Console.ReadKey();
}

public static IReadOnlyCollection<Foo> GetFoos()
{
    return Enumerable.Range(1, 100).Select(i => new Foo
    {
        Value = i.ToString(CultureInfo.CurrentCulture)

    }).ToList();
}

public static async Task<IReadOnlyCollection<Boo>> GetBoosAsync(IReadOnlyCollection<Foo> foos)
{
    List<Task<Boo>> booTasks = foos.Select(ConvertFooToBooAsync).ToList();

    // Waiting for ALL conversions of Foos to Boos
    await Task.WhenAll(booTasks.ToArray<Task>());

    return booTasks.Select(booTask => booTask.Result).ToList();
}

public static Task<Boo> ConvertFooToBooAsync(Foo foo)
{
    return Task.Factory.StartNew(() =>
    {
        Thread.Sleep(100);
        return new Boo { Value = foo.Value };
    });
}

方法GetBoosAsync()电话 ConvertFoosToBoosAsync对于每个元素,等待所有转换完成,然后返回结果列表。

问题:

如何实现方法GetBoosAsync返回 IObservable<Boo>相反,并在处理单个元素时异步返回它们?

public static IObservable<Boo> OGetBoos(IReadOnlyCollection<Foo> foos)
{
    ...
}

并像这样使用它:

static void Main(string[] args)
{
    IReadOnlyCollection<Foo> foos = GetFoos();

    IObservable<Boo> boos = OGetBoos(foos);

    boos = boos.Do(boo =>
    {
        Console.WriteLine(boo.Value);
    });

    boos.Wait();

    Console.ReadKey();
}

最佳答案

这对你有用吗:

public static IObservable<Boo> OGetBoos(IReadOnlyCollection<Foo> foos)
{
    var query =
        from f in foos.ToObservable()
        from b in ConvertFooToBooAsync(f).ToObservable()
        select b;

    return query;
}

顺便说一句,感谢您轻松编译问题中的工作代码!

关于c# - 来自 *Async 方法的 IObservable 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23461760/

相关文章:

react-native - ES6 和 ES7 特性没有在 react-native 中进行 babel 转译?

c# - Rx observable,如果某个超时到期,它会发布一个值

c# - MVC3 vb.net 到 C# WebGrid 问题

c# - 收据打印机上的 WPF PrintVisual 正在剪切图像

javascript - 返回后 JS 异步做事

c# - 没有样板的异步代码中的简单一般异常处理

c# - 处理除集合之外的绑定(bind)事件,以及在删除C#时取消绑定(bind)的事件-多线程

java - RX : Run Zipped Observables in parallel?

c# - 自动将一些 Where 子句添加到 Linq 表达式树

C# CLR/编译问题