Skip to content

Commit 5c89fdb

Browse files
committed
Don't block on worker threads in SetMessageRead
This should help with #146
1 parent ebe041e commit 5c89fdb

File tree

2 files changed

+12
-8
lines changed

2 files changed

+12
-8
lines changed

Signal-Windows.Lib/SignalLibHandle.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public interface ISignalLibHandle
5050
//Frontend API
5151
SignalStore Store { get; set; }
5252
Task SendMessage(SignalMessage message, SignalConversation conversation);
53-
void SetMessageRead(long index, SignalConversation conversation);
53+
Task SetMessageRead(long index, SignalConversation conversation);
5454
void ResendMessage(SignalMessage message);
5555
List<SignalMessageContainer> GetMessages(SignalConversation thread, int startIndex, int count);
5656
void SaveAndDispatchSignalConversation(SignalConversation updatedConversation, SignalMessage updateMessage);
@@ -331,15 +331,15 @@ await Task.Run(() =>
331331
/// Marks and dispatches a message as read. Must not be called on a task which holds the handle lock.
332332
/// </summary>
333333
/// <param name="message"></param>
334-
public void SetMessageRead(long index, SignalConversation conversation)
334+
public async Task SetMessageRead(long index, SignalConversation conversation)
335335
{
336336
Logger.LogTrace("SetMessageRead() locking");
337-
SemaphoreSlim.Wait(CancelSource.Token);
337+
await SemaphoreSlim.WaitAsync(CancelSource.Token);
338338
try
339339
{
340340
Logger.LogTrace("SetMessageRead() locked");
341341
conversation = SignalDBContext.UpdateMessageRead(index, conversation);
342-
DispatchMessageRead(index, conversation);
342+
await DispatchMessageRead(index, conversation);
343343
}
344344
finally
345345
{
@@ -489,7 +489,7 @@ internal void DispatchHandleMessage(SignalMessage message, SignalConversation co
489489
if (result != null)
490490
{
491491
SignalDBContext.UpdateMessageRead(result.Index, conversation);
492-
DispatchMessageRead(result.Index, conversation);
492+
DispatchMessageRead(result.Index, conversation).Wait();
493493
wasInstantlyRead = true;
494494
break;
495495
}
@@ -514,7 +514,7 @@ internal void DispatchHandleUnreadMessage(SignalMessage message)
514514
Task.WaitAll(operations.ToArray());
515515
}
516516

517-
internal void DispatchMessageRead(long messageIndex, SignalConversation conversation)
517+
internal async Task DispatchMessageRead(long messageIndex, SignalConversation conversation)
518518
{
519519
List<Task> operations = new List<Task>();
520520
foreach (var dispatcher in Frames.Keys)
@@ -524,6 +524,10 @@ internal void DispatchMessageRead(long messageIndex, SignalConversation conversa
524524
Frames[dispatcher].HandleMessageRead(messageIndex, conversation);
525525
}));
526526
}
527+
foreach (var waitHandle in operations)
528+
{
529+
await waitHandle;
530+
}
527531
Task.WaitAll(operations.ToArray());
528532
}
529533

Signal-Windows/Controls/Conversation.xaml.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -326,9 +326,9 @@ private void ScrollViewer_ViewChanged(object sender, ScrollViewerViewChangedEven
326326
LastMarkReadRequest < bottomIndex)
327327
{
328328
LastMarkReadRequest = bottomIndex;
329-
Task.Run(() =>
329+
Task.Run(async () =>
330330
{
331-
App.Handle.SetMessageRead(bottomIndex, SignalConversation);
331+
await App.Handle.SetMessageRead(bottomIndex, SignalConversation);
332332
});
333333
}
334334
}

0 commit comments

Comments
 (0)