Skip to content

Commit 32383de

Browse files
committed
stop bg task when the queue is drained
1 parent a2811c2 commit 32383de

File tree

4 files changed

+68
-44
lines changed

4 files changed

+68
-44
lines changed
Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,26 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
4-
using System.Text;
5-
using System.Threading.Tasks;
6-
using Signal_Windows.Models;
7-
8-
namespace Signal_Windows.Lib.Events
9-
{
10-
public class SignalMessageEventArgs : EventArgs
11-
{
12-
public SignalMessage Message { get; private set; }
13-
14-
public SignalMessageEventArgs(SignalMessage message)
15-
{
16-
Message = message;
17-
}
18-
}
19-
}
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using Signal_Windows.Models;
7+
8+
namespace Signal_Windows.Lib.Events
9+
{
10+
public enum SignalMessageType
11+
{
12+
NormalMessage,
13+
PipeEmptyMessage
14+
}
15+
public class SignalMessageEventArgs : EventArgs
16+
{
17+
public SignalMessage Message { get; private set; }
18+
public SignalMessageType MessageType { get; private set; }
19+
20+
public SignalMessageEventArgs(SignalMessage message, SignalMessageType type)
21+
{
22+
Message = message;
23+
MessageType = type;
24+
}
25+
}
26+
}

Signal-Windows.Lib/IncomingMessages.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ public void OnMessage(SignalServiceMessagePipeMessage message)
8181
Logger.LogWarning("OnMessage() could not handle unknown message type {0}", envelope.getType());
8282
}
8383
}
84+
else if (message is SignalServiceMessagePipeEmptyMessage)
85+
{
86+
Handle.DispatchPipeEmptyMessage();
87+
}
8488
}
8589
finally
8690
{

Signal-Windows.Lib/SignalLibHandle.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,10 +279,15 @@ internal void DispatchHandleMessage(SignalMessage message, SignalConversation co
279279
Frames[dispatcher].HandleMessage(message, conversation);
280280
}));
281281
}
282-
SignalMessageEvent?.Invoke(this, new SignalMessageEventArgs(message));
282+
SignalMessageEvent?.Invoke(this, new SignalMessageEventArgs(message, Events.SignalMessageType.NormalMessage));
283283
Task.WaitAll(operations.ToArray());
284284
}
285285

286+
internal void DispatchPipeEmptyMessage()
287+
{
288+
SignalMessageEvent?.Invoke(this, new SignalMessageEventArgs(null, Events.SignalMessageType.PipeEmptyMessage));
289+
}
290+
286291
internal void HandleMessageSentLocked(SignalMessage msg)
287292
{
288293
Logger.LogTrace("HandleMessageSentLocked() locking");

Signal-Windows.RC/SignalBackgroundTask.cs

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public sealed class SignalBackgroundTask : IBackgroundTask
2424
private BackgroundTaskDeferral Deferral;
2525
private SignalLibHandle Handle;
2626
private ToastNotifier ToastNotifier;
27-
private AutoResetEvent e = new AutoResetEvent(false);
27+
private AutoResetEvent ResetEvent = new AutoResetEvent(false);
2828

2929
public void Run(IBackgroundTaskInstance taskInstance)
3030
{
@@ -47,7 +47,7 @@ public void Run(IBackgroundTaskInstance taskInstance)
4747
Handle = new SignalLibHandle(true);
4848
Handle.SignalMessageEvent += Handle_SignalMessageEvent;
4949
Handle.BackgroundAcquire();
50-
e.WaitOne();
50+
ResetEvent.WaitOne();
5151
}
5252
catch (Exception e)
5353
{
@@ -65,38 +65,46 @@ public void Run(IBackgroundTaskInstance taskInstance)
6565
private void OnCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
6666
{
6767
Logger.LogInformation("Background task received cancel request");
68-
e.Set();
68+
ResetEvent.Set();
6969
}
7070

7171
private void Handle_SignalMessageEvent(object sender, SignalMessageEventArgs e)
7272
{
73-
string notificationId = e.Message.ThreadId;
74-
ToastBindingGeneric toastBinding = new ToastBindingGeneric();
75-
76-
var notificationText = GetNotificationText(e.Message.Author.ThreadDisplayName, e.Message.Content.Content);
77-
foreach (var item in notificationText)
73+
if (e.MessageType == Lib.Events.SignalMessageType.NormalMessage)
7874
{
79-
toastBinding.Children.Add(item);
80-
}
75+
string notificationId = e.Message.ThreadId;
76+
ToastBindingGeneric toastBinding = new ToastBindingGeneric();
8177

82-
ToastContent toastContent = new ToastContent()
83-
{
84-
Launch = notificationId,
85-
Visual = new ToastVisual()
78+
var notificationText = GetNotificationText(e.Message.Author.ThreadDisplayName, e.Message.Content.Content);
79+
foreach (var item in notificationText)
8680
{
87-
BindingGeneric = toastBinding
88-
},
89-
DisplayTimestamp = DateTimeOffset.FromUnixTimeMilliseconds(e.Message.ReceivedTimestamp)
90-
};
81+
toastBinding.Children.Add(item);
82+
}
9183

92-
ToastNotification toastNotification = new ToastNotification(toastContent.GetXml());
93-
uint expiresIn = e.Message.ExpiresAt;
94-
if (expiresIn > 0)
84+
ToastContent toastContent = new ToastContent()
85+
{
86+
Launch = notificationId,
87+
Visual = new ToastVisual()
88+
{
89+
BindingGeneric = toastBinding
90+
},
91+
DisplayTimestamp = DateTimeOffset.FromUnixTimeMilliseconds(e.Message.ReceivedTimestamp)
92+
};
93+
94+
ToastNotification toastNotification = new ToastNotification(toastContent.GetXml());
95+
uint expiresIn = e.Message.ExpiresAt;
96+
if (expiresIn > 0)
97+
{
98+
toastNotification.ExpirationTime = DateTime.Now.Add(TimeSpan.FromSeconds(expiresIn));
99+
}
100+
toastNotification.Tag = notificationId;
101+
ToastNotifier.Show(toastNotification);
102+
}
103+
else if (e.MessageType == Lib.Events.SignalMessageType.PipeEmptyMessage)
95104
{
96-
toastNotification.ExpirationTime = DateTime.Now.Add(TimeSpan.FromSeconds(expiresIn));
105+
Logger.LogInformation("Background task has drained the pipe");
106+
ResetEvent.Set();
97107
}
98-
toastNotification.Tag = notificationId;
99-
ToastNotifier.Show(toastNotification);
100108
}
101109

102110
private IList<AdaptiveText> GetNotificationText(string authorName, string content)

0 commit comments

Comments
 (0)