Прослушивание текста / потока событий с использованием 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();
}
}