我希望服务器使用WCF Discovery不断跟踪可用的客户端。
public void Start()
{
findCriteria = new FindCriteria(typeof(ITestRunnerAgent))
{
Scopes = {new Uri(scope)},
Duration = TimeSpan.FromMilliseconds(DiscoveryIntervalInMiliseconds)
};
discoveryClient = GetInitilizedDisoveryClient();
discoveryClient.FindAsync(findCriteria);
}
private DiscoveryClient GetInitilizedDisoveryClient()
{
var client = new DiscoveryClient(new UdpDiscoveryEndpoint());
client.FindProgressChanged += OnFindProgressChanged;
client.FindCompleted += OnFindCompleted;
return client;
}
private void OnFindCompleted(object sender, FindCompletedEventArgs e)
{
if (!e.Cancelled)
{
// HERE! Sometimes e.Error is not null, but as described in question
discoveryClient.FindAsync(findCriteria);
}
}
不幸的是,有时在评论指定的点上我会获得一个中止的Udp频道:
通讯对象, System.ServiceModel.Channels.UdpChannelFactory + ClientUdpDuplexChannel, 不能用于沟通 因为它已被中止。
有没有人想过为什么?
答案 0 :(得分:0)
可能是您办公室的某些网络基础设施正在断开连接。
您应编写代码以检查中止的通信,并从中恢复。
要恢复,您可以关闭已中止的频道并创建一个新频道。
答案 1 :(得分:0)
嗯,这不能回答你的问题,但我对你的代码有点担心。这似乎从根本上说是正确的,但感觉你的发现可能会非常快。我会在一个单独的线程中实现重复发现,只需要一些睡眠时间,以使网络更快乐。只是想清理代码。对不起,如果这没有帮助。
public void Start()
{
var bw = new System.ComponentModel.BackgroundWorker();
bw.DoWork += new System.ComponentModel.DoWorkEventHandler(DiscoveryThread);
bw.RunWorkerAsync();
}
private void DiscoveryThread(object sender, System.ComponentModel.DoWorkEventArgs e)
{
var client = new DiscoveryClient(new UdpDiscoveryEndpoint());
var findCriteria = new FindCriteria(typeof(ITestRunnerAgent))
{
Scopes = {new Uri(scope)},
Duration = TimeSpan.FromMilliseconds(DiscoveryIntervalInMiliseconds)
};
while(true)
{
client.Find(findCriteria);
// lock, clear, and add discovered endpoints to a global List of some sort
System.Threading.Thread.Sleep(3000);
}
}
答案 2 :(得分:0)
由于它是异步操作,因此线程在执行FindAsync(criteria)方法后终止。只是在方法调用后写入Console.Readline()或使用Autoreset事件保持线程。