Прослушивание текста / потока событий с использованием C#

Я пишу класс 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
}

В моем тесте событие поднято один раз, но не дважды. Событие на сервере, по сути, является переключателем - что-то происходит, и оно продолжается, что-то еще происходит, и оно уходит. Я знаю, что переключение работает, потому что я подключил поток событий к нормальной веб-странице, чтобы проверить его.

Как я должен иметь дело с потоками событий в C#?

Редактировать 1: я обновил код, чтобы исправить ошибку, на которую указывает TimVK, но поток событий все еще не перехватывается во второй раз, когда это должно быть.

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 
} 

Тогда я полагаю, что это событие должно подниматься каждый раз.

      namespace WindowsFormsApp3
{
    public partial class Form1 : Form
    {
        WebClient myWebRequest = null;
        String Path = "http://192.168.196.106/home/events/";
        Uri uri = null;

        public Form1()
        {
            InitializeComponent();

            uri = new Uri(Path);

            this.myWebRequest = new WebClient();
            this.myWebRequest.Headers.Set("Host", "192.168.196.106");

            this.myWebRequest.OpenReadCompleted += MyWebRequest_OpenReadCompleted;
        }

        private async void MyWebRequest_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            using (var sr = new StreamReader(e.Result))
            {
                try
                {
                    while (true)
                    {
                        var message = await sr.ReadLineAsync();
                        Debug.WriteLine("message = {0}", (object)message);
                    }
                }
                catch (WebException ex)
                {
                    Debug.WriteLine("WebException: {0}", (object)ex.Message);
                }
                catch (IOException ex)
                {
                    Debug.WriteLine("IOException: {0}", (object)ex.Message);
                }
                catch (Exception ex)
                {
                    Debug.WriteLine("Exception: {0}", (object)ex.Message);
                }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            myWebRequest.OpenReadAsync(uri);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            myWebRequest.CancelAsync();
        }
    }
Другие вопросы по тегам