EventManager rewritten to support a push arch instead of an internal poll. Crash finally fixed!!! The dangers of threading.
This commit is contained in:
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user