Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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# 无法返回IObservable<;T>;来自标记为async的方法_C#_Async Await_System.reactive - Fatal编程技术网

C# 无法返回IObservable<;T>;来自标记为async的方法

C# 无法返回IObservable<;T>;来自标记为async的方法,c#,async-await,system.reactive,C#,Async Await,System.reactive,这个人为设计的示例大致描述了我的代码的结构: public abstract class SuperHeroBase { protected SuperHeroBase() { } public async Task<CrimeFightingResult> FightCrimeAsync() { var result = new CrimeFightingResult(); result.State = CrimeFigh

这个人为设计的示例大致描述了我的代码的结构:

public abstract class SuperHeroBase
{
    protected SuperHeroBase() { }

    public async Task<CrimeFightingResult> FightCrimeAsync()
    {
        var result = new CrimeFightingResult();

        result.State = CrimeFightingStates.Fighting;

        try
        {
            await FightCrimeOverride(results);
        } 
        catch
        {
            SetError(results);
        }

        if (result.State == CrimeFightingStates.Fighting)
            result.State = CrimeFightingStates.GoodGuyWon;

        return result;
    }

    protected SetError(CrimeFightingResult results)
    {
        result.State = CrimeFightingStates.BadGuyWon;
    }

    protected abstract Task FightCrimeOverride(CrimeFightingResult results);
}

public enum CrimeFightingStates
{
    NotStarted,
    Fighting,
    GoodGuyWon, // success state
    BadGuyWon // error state
}

public class CrimeFightingResult
{
    internal class CrimeFightingResult() { }

    public CrimeFightingStates State { get; internal set; }
}

我如何返回
ioobservable
并仍然等待调用
FightCrimeAsync

您可以将任务转换为可观察任务,并使用
合并
将其合并:

public IObservable<CrimeFightingResult> AllHerosFightCrime()
{
    var heros = new List<SuperHeroBase>(this);
    return heros.Select(h => h.FightCrimeAsync().ToObservable())
        .Merge();
}
公共IObservable AllHerosFightCrime()
{
var heros=新列表(此);
返回heros.Select(h=>h.FightCrimeAsync().ToObservable())
.Merge();
}

如果您想保持接收事件的顺序,您可以使用
Concat
而不是您所写的
Merge

,我认为允许在第一个
FightCrimeAsync
完成之前启动第二个
FightCrimeAsync
。即使当前的
Select
ToObservable
Merge
的实现使其按您想要的方式运行,这些函数的描述也允许其他行为。使用此代码运行一些更详细的测试后,@hvd是正确的。FightCrimeAsync任务可能会失去顺序。@mbursill-如果要保持顺序,请使用
Concat
而不是
Merge
。如果要这样做,可能需要延迟:“.Select(h=>Observable.Defer(()=>async h.FightCrimeAsync())”
public IObservable<CrimeFightingResult> AllHerosFightCrime()
{
    var heros = new List<SuperHeroBase>(this);
    return heros.Select(h => h.FightCrimeAsync().ToObservable())
        .Merge();
}