c# – 如何使用特定的属性值等待IObservable中的对象?
作者:互联网
为了澄清,我有一个方法:
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,而不是在所有核心都忙时抛出异常.从那里,您将需要一些方案来检测核心何时可用于下一个工作单元,即事件或轮询.
标签:c,net,c-5-0,system-reactive 来源: https://codeday.me/bug/20190709/1417830.html