为了澄清,我有一个方法:
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); }
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”.
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。