小编Aar*_*ron的帖子

Rx:组合ThrottleFirst和Sample运算符

给定源可观察的S,我如何要求RxJava/Rx生成可观察的D,即:

  1. 从S发出第一个项目,没有任何延迟
  2. 在发出每个项目之后和发出下一个项目L之前等待至少T秒,其中L是在等待期间S发出的最后一个项目
  3. 如果S在等待期间T(从第2点开始)没有产生任何项目,则在S上出现后立即发出下一个项目

大理石图:

在此输入图像描述

我想用:

  • 样本运算符,但不满足要求#3.
  • 去抖操作符,但它也不满足要求#3.
  • ThrottleFirst运算符,但它不满足要求#2,因为它不记得L(而Sample会这样做).

我更喜欢最简单的答案,即利用标准运算符(如果可能的话).

rx-java

5
推荐指数
1
解决办法
1222
查看次数

如何将任务转换为任务<T>?

我确信之前已经提出这个问题,但我似乎无法用正确的方式来表达任何能够解决我问题的答案.

我有一个基类,它实现了一个返回任务的Save方法的接口:

public interface ICanSave
{
    Task Save();
}

public class Base : ICanSave
{
    public Task Save()
    {
        return Task.CompletedTask;
    }
}
Run Code Online (Sandbox Code Playgroud)

当然Save方法实际上会做一些事情,比如保存到数据库,这就是为什么它是一个Task,所以可以等待它.如果我有一个继承自基类的Foo类:

public class Foo : Base { }
Run Code Online (Sandbox Code Playgroud)

目前,您必须执行实例化并保存两个不同的步骤:

var foo = new Foo();

await foo.Save();
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够进行实例化并将save另存为表达式并返回一个Task.我想出了这个帮手:

public static class Helper<T> where T : ICanSave
{
    public static Task<T> Save(T obj)
    {
        var source = new TaskCompletionSource<T>();

        ThreadPool.QueueUserWorkItem(_ =>
        {
            obj.Save();
            source.SetResult(obj);
        });

        return source.Task;
    }
}
Run Code Online (Sandbox Code Playgroud)

那可以用来做:

var foo = await Helper<Foo>.Save(new Foo());
Run Code Online (Sandbox Code Playgroud)

这更像是我想要实现的结果,但它似乎相当麻烦,加上帮助器似乎是将Save保存到任务两次(一次用于原始Task,第二次用于帮助).

有没有更简单的方法来执行从任务到T的任务的转换?

c# task

2
推荐指数
1
解决办法
744
查看次数

标签 统计

c# ×1

rx-java ×1

task ×1