EventManager rewritten to support a push arch instead of an internal poll. Crash finally fixed!!! The dangers of threading.

This commit is contained in:
watsonb8
2019-07-15 12:14:38 -04:00
parent d78dce44f0
commit 00b39b1d84
6 changed files with 254 additions and 327 deletions

View File

@ -31,7 +31,6 @@ namespace Aurora.Design.Views.Party
private RemotePartyService.RemotePartyServiceClient _remotePartyClient;
private RemotePlaybackService.RemotePlaybackServiceClient _remotePlaybackClient;
private RemoteEventService.RemoteEventServiceClient _remoteEventsClient;
private Task _eventsTask;
CancellationTokenSource _eventCancellationTokenSource;
@ -129,7 +128,6 @@ namespace Aurora.Design.Views.Party
_remoteEventsClient = new RemoteEventService.RemoteEventServiceClient(_channel);
//Assign but don't start task
_eventsTask = new Task(GetEvents);
_eventCancellationTokenSource = new CancellationTokenSource();
}
@ -159,6 +157,7 @@ namespace Aurora.Design.Views.Party
try
{
Console.WriteLine(string.Format("CLIENT {0} - SubscribeToEvents called from client with id", SettingsService.Instance.ClientId));
_remoteEventsClient.SubscribeToEvents(req);
}
catch (Exception ex)
@ -166,8 +165,7 @@ namespace Aurora.Design.Views.Party
Console.WriteLine("Error subscribing to events: " + ex.Message);
}
_eventsTask.Start();
GetEvents();
}
@ -200,22 +198,31 @@ namespace Aurora.Design.Views.Party
OnPropertyChanged("IsNotSelectingHost");
}
private void AddMember(PartyMember member)
{
Members.Add(member);
}
/// <summary>
/// Asynchronous function for processing events off of the event stream.
/// </summary>
/// <returns></returns>
private async void GetEvents()
{
Console.WriteLine(string.Format("CLIENT {0} - GetEvents called from client with id", SettingsService.Instance.ClientId));
using (AsyncServerStreamingCall<BaseEvent> eventStream = _remoteEventsClient
.GetEvents(new EventsRequest { ClientId = SettingsService.Instance.ClientId }))
{
while (!_eventCancellationTokenSource.Token.IsCancellationRequested &&
await eventStream.ResponseStream.MoveNext(_eventCancellationTokenSource.Token))
{
Console.WriteLine(string.Format("CLIENT {0} - Event received for client with id", SettingsService.Instance.ClientId));
try
{
//Convert derived event type
BaseEvent e = eventStream.ResponseStream.Current;
BaseEvent e = new BaseEvent(eventStream.ResponseStream.Current);
switch (e.DerivedEventCase)
{
case BaseEvent.DerivedEventOneofCase.None:
@ -225,7 +232,16 @@ namespace Aurora.Design.Views.Party
case BaseEvent.DerivedEventOneofCase.PartyMemberJoinedEvent:
{
PartyMemberJoinedEvent derivedEvent = e.PartyMemberJoinedEvent;
Members.Add(derivedEvent.Member);
PartyMember member = new PartyMember
{
UserName = derivedEvent.Member.UserName,
Id = derivedEvent.Member.Id,
IpAddress = derivedEvent.Member.IpAddress,
Port = derivedEvent.Member.Port
};
AddMember(member);
break;
}
case BaseEvent.DerivedEventOneofCase.PartyMemberLeftEvent:
@ -234,7 +250,7 @@ namespace Aurora.Design.Views.Party
var found = Members.Where(x => x.Id == derivedEvent.Member.Id);
foreach (PartyMember member in found)
{
Members.Remove(member);
_members.Remove(member);
}
break;
}
@ -245,6 +261,8 @@ namespace Aurora.Design.Views.Party
{
Console.WriteLine(string.Format("EXCEPTION --- " + ex.Message));
}
OnPropertyChanged("Members");
}
}
}