簡體   English   中英

使用 C# 監聽文本/事件流

[英]Listening to text/event-stream using C#

我正在編寫一個 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 指出的錯誤,但事件流仍然沒有被第二次拾取。

當您將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();
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM