2

単純なWebサービスをラップアラウンドするC#クラスを作成しています。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
}

私のテストでは、イベントは1回ピックアップされますが、2回はピックアップされません。サーバー上のイベントは本質的にスイッチです-何かが起こってそれが続き、何か他のことが起こってそれが消えます。イベントストリームを通常のWebページに接続してテストしたので、切り替えが機能することはわかっています。

C#でイベントストリームをどのように処理する必要がありますか?

編集1:TimVKが指摘するバグを修正するためにコードを更新しましたが、イベントストリームが2回目に取得されていません。

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 に答える