Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转换IEnumerable<;任务<;T>&燃气轮机;至可观察<;T>;_C#_.net_Task Parallel Library_System.reactive - Fatal编程技术网

C# 转换IEnumerable<;任务<;T>&燃气轮机;至可观察<;T>;

C# 转换IEnumerable<;任务<;T>&燃气轮机;至可观察<;T>;,c#,.net,task-parallel-library,system.reactive,C#,.net,Task Parallel Library,System.reactive,我试图使用反应式扩展(Rx)来缓冲任务完成时的枚举。有人知道有没有一种干净的内置方式可以做到这一点吗?ToObservable扩展方法只会生成一个ioobservable,这不是我想要的,我想要一个ioobservable,然后我可以使用缓冲区 人为的例子: //Method designed to be awaitable public static Task<int> makeInt() { return Task.Run(() => 5); } //In pr

我试图使用反应式扩展(Rx)来缓冲任务完成时的枚举。有人知道有没有一种干净的内置方式可以做到这一点吗?
ToObservable
扩展方法只会生成一个
ioobservable
,这不是我想要的,我想要一个
ioobservable
,然后我可以使用
缓冲区

人为的例子:

//Method designed to be awaitable
public static Task<int> makeInt()
{
     return Task.Run(() => 5);
}

//In practice, however, I don't want to await each individual task
//I want to await chunks of them at a time, which *should* be easy with Observable.Buffer 
public static void Main() 
{
    //Make a bunch of tasks
    IEnumerable<Task<int>> futureInts = Enumerable.Range(1, 100).Select(t => makeInt());

    //Is there a built in way to turn this into an Observable that I can then buffer?
    IObservable<int> buffered = futureInts.TasksToObservable().Buffer(15); //????

    buffered.Subscribe(ints => {
        Console.WriteLine(ints.Count()); //Should be 15
    });
}
//设计为可等待的方法
公共静态任务makeInt()
{
返回任务。运行(()=>5);
}
//然而,在实践中,我不想等待每一项任务
//我想一次等待一大块,这对于Observable.Buffer来说应该很容易
公共静态void Main()
{
//做一堆任务
IEnumerable futureInts=Enumerable.Range(1100).Select(t=>makeInt());
//有没有一种内置的方法可以将其转化为我可以缓冲的可观察的东西?
IObservable buffered=futureInts.TasksToObservable().Buffer(15);/????
buffered.Subscribe(ints=>{
Console.WriteLine(ints.Count());//应该是15
});
}

您可以使用这样一个事实,即
任务
可以通过使用转换为可观察任务

当您有一个(单个项目)可观察对象的集合时,您可以创建一个包含项目的单个可观察对象,这些项目在完成时使用

因此,您的代码可以如下所示:

futureInts.Select(t => t.ToObservable())
          .Merge()
          .Buffer(15)
          .Subscribe(ints => Console.WriteLine(ints.Count));

有没有一种简单的方法可以将
Task
转换为
IObservable
,而
Task
的结果是
IObservable
中的一系列结果?@JonathanPeel我认为
Task.ToObservable()。选择多个(x=>x)
应该可以工作。