C# 如何放置任务<;T>;进入ObservableCollection并使用EventLoopScheduler处理它?

C# 如何放置任务<;T>;进入ObservableCollection并使用EventLoopScheduler处理它?,c#,task-parallel-library,observablecollection,system.reactive,observer-pattern,C#,Task Parallel Library,Observablecollection,System.reactive,Observer Pattern,目前我有一个由TPL scheduler处理的任务: var result = await task; var scheduler = new EventLoopScheduler(); Observable .FromEventPattern<NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>( e => _collection.CollectionChang

目前我有一个由TPL scheduler处理的任务:

var result = await task;
var scheduler = new EventLoopScheduler();

Observable
    .FromEventPattern<NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>(
        e => _collection.CollectionChanged += e,
        e => collection.CollectionChanged -= e)
    .Where(e => e.EventArgs.Action == NotifyCollectionChangedAction.Add)
    .Select(e => e.EventArgs.NewItems.Cast<Task<T>>())
    .ObserveOn(scheduler)
    .Do(x => scheduler.Schedule(
        () => Thread.Sleep(TimeSpan.FromSeconds(1)))) // once a second
    .Subscribe(???);
是否可以通过将其放入ObservableCollection并由特定Rx调度器处理来推迟其等待/执行:

var result = await task;
var scheduler = new EventLoopScheduler();

Observable
    .FromEventPattern<NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>(
        e => _collection.CollectionChanged += e,
        e => collection.CollectionChanged -= e)
    .Where(e => e.EventArgs.Action == NotifyCollectionChangedAction.Add)
    .Select(e => e.EventArgs.NewItems.Cast<Task<T>>())
    .ObserveOn(scheduler)
    .Do(x => scheduler.Schedule(
        () => Thread.Sleep(TimeSpan.FromSeconds(1)))) // once a second
    .Subscribe(???);
var do=new do();
var result=wait do.Later(()=>1+2);
公共课做什么
{
私有主题_backlog=新主题();
公营部门()
{
可观察的组合相关测试(_backlog,可观察的计时器(…),(l,r)=>l)
.Subscribe(x=>x());
}
稍后执行公共任务(Func getResult)
{
var tcs=new TaskCompletionSource();
_backlog.OnNext(()=>{
尝试
{
var result=getResult();
tcs.SetResult(结果);
}
捕获(例外情况除外)
{
tcs.SetException(ex);
}
});
返回tcs.Task;
}
}

如果您计划过渡到RX,为什么要使用TPL?只需使用下面的内容,并使用任何您想要的调度程序

Observable.Interval(TimeSpan.FromSeconds(1))
            .Select(_ => "SomeResult")
            .Subscribe(x => Console.WriteLine("{0} - {1}", DateTime.Now.Second, x));

代码
等待任务不是“立即执行任务”;它正在(异步)等待任务完成。任务已经开始。你是在问如何推迟任务的开始还是等待任务?@Stephan:是的,当然,是等待,而不是立即执行。编辑,谢谢!我的问题是如何不在TPL调度程序上运行任务,而是在Rx调度程序(每秒运行1个任务)上运行任务。您的实际目标是什么?你想每秒启动一个任务吗?还是在每项任务完成后等待一秒钟?@Stephen:我想每秒开始一项任务。可能可以观察到。示例(TimeSpan)可以在这里工作,但由于其超级唯一的名称,我刚才偶然发现了它。您想要的是
委托
而不是
任务
。它们是非常不同的东西。
任务
表示飞行中的异步计算。
委托是执行计算的指令。当您的
任务
计算已经开始时,您无法更改运行该计算的位置的行为。最后,您不需要使用集合来构建调度程序来调度在调度程序上完成的工作……只需将工作直接添加到调度程序中即可。我认为这里的Zip()将在每次操作后添加1秒。但是,我希望在不早于上一个(受限制的api客户端)后1秒运行操作。因此,如果没有发生任何操作或此后超过1秒,我希望立即运行该操作。此外,如果OnNext()具有返回类型void,那么如何将未来编译的结果返回给调用方?使用
wait task
它会“自动”为您执行。顺便问一下,您认为什么工作会更好:组合测试+计时器还是样本?真的吗?我想油门会丢失/掉落物品。而样品不会。但由于其超级独特的名称,几乎不可能找到该样本的示例。想想看吧这个示例非常类似于throttle,只是throttle有一个超时,每次发生下一个事件时都会重置。样本不存在。我有一个使用信号量lim的解决方案,但我现在正在睡觉。明天将发布…Interval()在这里不起作用:它是计时器。我不需要等待一秒钟,如果之前没有作业,它应该立即运行。回答为什么TPL和Rx都使用:我使用TPL是因为使用HttpClient访问远程RESTAPI,Rx是因为需要正确地调度请求。API已节流,将返回403错误。