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

标签 c# .net system.reactive c#-5.0

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

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

GetComputersInLan 方法返回 IPAddress 的 IObservable

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);
    }

GetNode 方法构造一个节点。

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;
    }
}

Handler是一台远程计算机,AvailableCores代表它的cpu核数。

我想要的是等待方法 GetNodes 返回第一个具有超过 0 个 AvailableCores 的节点。

await GetNodes().FirstAsync(node => node.AvailableCore > 0)

但是发生的事情是,在对方法 Invoke 进行了足够多的调用之后,它没有等待内核变得可用,而是触发了一个异常“序列不包含任何元素”。

最佳答案

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

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

关于c# - 如何等待具有特定属性值的 IObservable 中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7980302/

相关文章:

.net 数据库模式比较 api

c# - 通过中介路由 WCF?

C# 创建类和派生类的实例

c# - Elasticsearch搜索不区分大小写的字段的确切值

c# - 这两个 linq 实现有什么区别?

c# - 帮助减少与数据库的连接数

wpf - IObservable<T> 和 INotifyPropertyChanged - 是否存在连接

.net - 如何创建从 MSMQ 消息队列中读取的 IObservable<T>?

linq - System.IObservable<字符串> 到 System.IObservable<System.Collections.Generic.List<字符串>>

c# - POP3 协议(protocol)是否必须在邮件服务器中实现?