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,而不是在所有核心都忙时抛出异常.从那里,您将需要一些方案来检测核心何时可用于下一个工作单元,即事件或轮询. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 通过header函数生成XML
- rmarkdown ioslides:文件夹中的输出文件和其他文件夹中的依
- 切换 ORACLE 客户端字符集
- postgresql – 扩展名存在但uuid_generate_v4失败
- 如何在PostgreSQL中添加可变数量的日期?
- swift开发笔记24 解决键盘遮挡输入框 的方法
- c# – Rhino Mocks 3.5测试没有调用属性setter
- xml The processing instruction target matching "[xX
- Oracle 不能删除存储过程的处理
- 关于ActionScript3中的fl.transitions.Tween类应用时的注意