Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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中等待对象?_C#_.net_System.reactive_C# 5.0 - Fatal编程技术网

C# 如何在具有特定属性值的IObservable中等待对象?

C# 如何在具有特定属性值的IObservable中等待对象?,c#,.net,system.reactive,c#-5.0,C#,.net,System.reactive,C# 5.0,为了澄清,我有一个方法: public static IObservable<Node> GetNodes() { var computers = GetComputersInLan(); return computers.Select(computerAddress => GetNode(computerAddress)); } 但发生的情况是,在对方法调用足够多的调用之后,它不会等待核心变为可用,而是

为了澄清,我有一个方法:

public static IObservable<Node> GetNodes()
    {            
        var computers = GetComputersInLan();
        return computers.Select(computerAddress => GetNode(computerAddress));
    }

但发生的情况是,在对方法调用足够多的调用之后,它不会等待核心变为可用,而是触发异常“序列不包含元素”。

这是该方法的预期行为
FirstAsync
将只检查您传递给它的项目的当前状态,返回第一个匹配项,或者在没有匹配项时抛出遇到的异常


您必须自己管理等待核心可用的情况。您可以尝试
FirstOrDefaultAsync
返回null,而不是在所有内核都忙时引发异常。从这里开始,您将需要一些方案来检测核心何时可用于下一个工作单元,无论是事件还是轮询。

您可以发布GetComputersInLan和GetNode的代码吗?轮询正是我试图避免的,至于事件,观察值不是用来改善事件的吗?使用
ManualResetEvent
发出堆芯可用的信号。使用ManualResetEvent和wait或Rx是错误的™ - 根据您构建它的方式,Amb或SelectMany是您需要的运算符。@IvanMilutinovićObservables允许您合成事件,并且在某种程度上是事件的替代品。它们不是魔法;您仍然需要提供某种方式来通知“核心可用”。@GideonEngelberth我意识到我必须做什么,这是如何做的,这困扰着我:)问题仍然存在。有可能只用Rx就可以做到吗
private static IObservable<IPAddress> GetComputersInLan()
    {
        var tasks = new List<Task<PingReply>>();
        for (int i = 1; i < 255; i++)
        {
            Ping p = new Ping();
            ipBytes[3] = (byte)(++ipBytes[3]);
            IPAddress address = new IPAddress(ipBytes);
            tasks.Add(p.SendPingAsync(address, 2000));
        }
        return tasks.ToObservable().Where(x => x.Result.Status == IPStatus.Success).Select(y => y.Result.Address);
    }
private static Node GetNode(IPAddress ipAddress)
    {
       return new Node(ipAddress, (IHandler)Activator.GetObject(typeof(Handler), "tcp://" + ipAddress + ":1337/handler"));
    }

public class Node
{
    private IHandler Handler { get; set; }
    public IPAddress Address { get; set; }
    public int AvailableCores { get; set; }

    public async Task<TResult> Invoke<TResult>(Func<TResult> method)
    {
        AvailableCores--;
        var result = await Task.Run<TResult>(() => Handler.Invoke(method));
        AvailableCores++;
        return result;
    }
}
await GetNodes().FirstAsync(node => node.AvailableCore > 0)