2

我正在编写一个 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 指出的错误,但事件流仍然没有被第二次拾取。

4

1 回答 1

2

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 
} 

然后我想应该每次都提出这个事件。

于 2012-07-13T08:19:22.547 回答