加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何使用特定的属性值等待IObservable中的对象?

发布时间:2020-12-15 21:25:21 所属栏目:百科 来源:网络整理
导读:为了澄清,我有一个方法: public static IObservableNode GetNodes() { var computers = GetComputersInLan(); return computers.Select(computerAddress = GetNode(computerAddress)); } GetComputersInLan方法返回IPAddress的IObservable private static I
为了澄清,我有一个方法:

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方法构造一个Node.

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进行足够的调用之后,它不会等待内核变为可用,而是触发异常“sequence contains no elements”.

解决方法

这是此方法的预期行为. FirstAsync仅检查传递给它的项目的当前状态,返回第一个匹配或抛出您遇到的异常(如果没有匹配).

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读