我正在编写一个C#类来包装一个简单的Web服务。 RESTful的东西很容易结束,但现在我需要在服务器上的某些东西发生变化时引发一个事件。
我已经设置了服务器以使事件流可用,但我不知道如何在C#中获取流。
目前我喜欢这样的事情:
public class ServiceWrapper
{
private readonly wc = new WebClient();
public ServiceWrapper()
{
wc.OpenReadAsync(new Uri(UriOfEvent));
wc.OpenReadCompleted += ServerEventOccurs;
}
private void ServerEventOccurs(object sender, OpenReadCompletedEventArgs args)
{
using (var sr = new StreamReader(args.Result))
{
var message = ParseStream(sr);
RaiseServerEventOccurred(message);
}
wc.OpenReadAsync(new Uri(UriOfEvent));
}
//usual code for declaring and raising ServerEventOccurred event
}
在我的测试中,事件被拾取一次,但不是两次。服务器上的事件本质上是一个开关 - 事情发生了,它继续发生,其他事情发生,它就会消失。我知道切换工作,因为我已将事件流连接到正常的网页进行测试。
我应该如何处理C#中的事件流?
编辑1:我已更新代码以修复TimVK指出的错误,但事件流仍然没有被第二次拾取。
答案 0 :(得分:1)
当你将wc
作为一个属性而不是在你的方法中创建一个新属性时,它不起作用吗?
public class ServiceWrapper
{
WebClient wc {get;set;}
public ServiceWrapper()
{
wc = new WebClient();
wc.OpenReadAsync(new Uri(UriOfEvent));
wc.OpenReadCompleted += ServerEventOccurs;
}
private void ServerEventOccurs(object sender, OpenReadCompletedEventArgs args)
{
using (var sr = new StreamReader(args.Result))
{
var message = ParseStream(sr);
RaiseServerEventOccurred(message);
}
wc = new WebClient();
wc.OpenReadAsync(new Uri(UriOfEvent));
}
//usual code for declaring and raising ServerEventOccurred event
}
然后我想每次都应该提出这个事件。