public async Task Reacquire() { Logger.LogTrace("Reacquire() locking"); CancelSource = new CancellationTokenSource(); SemaphoreSlim.Wait(CancelSource.Token); try { GlobalResetEvent = LibUtils.OpenResetEventSet(); LibUtils.Lock(); GlobalResetEvent.Reset(); LibsignalDBContext.ClearSessionCache(); Instance = this; await Task.Run(async() => { List <Task> tasks = new List <Task>(); foreach (var f in Frames) { var conversations = GetConversations(); var taskCompletionSource = new TaskCompletionSource <bool>(); await f.Key.RunAsync(CoreDispatcherPriority.Normal, () => { try { f.Value.ReplaceConversationList(conversations); } catch (Exception e) { Logger.LogError("Reacquire() ReplaceConversationList() failed: {0}\n{1}", e.Message, e.StackTrace); } finally { taskCompletionSource.SetResult(false); } }); tasks.Add(taskCompletionSource.Task); } foreach (var t in tasks) { await t; } await RecoverDownloads(); Store = LibsignalDBContext.GetSignalStore(); if (Store != null) { LikelyHasValidStore = true; } }); if (LikelyHasValidStore) { InitNetwork(); } Running = true; } finally { SemaphoreSlim.Release(); Logger.LogTrace("Reacquire() released"); } }
public async Task Reacquire() { Logger.LogTrace("Reacquire() locking"); CancelSource = new CancellationTokenSource(); SemaphoreSlim.Wait(CancelSource.Token); GlobalResetEvent = LibUtils.OpenResetEventSet(); LibUtils.Lock(); GlobalResetEvent.Reset(); LibsignalDBContext.ClearSessionCache(); Instance = this; await Task.Run(() => { List <Task> tasks = new List <Task>(); foreach (var f in Frames) { var conversations = GetConversations(); tasks.Add(f.Key.RunTaskAsync(() => { f.Value.ReplaceConversationList(conversations); })); } Task.WaitAll(tasks.ToArray()); InitNetwork(); }); Running = true; Logger.LogTrace("Reacquire() releasing"); SemaphoreSlim.Release(); }