提交 fadaba7d 编写于 作者: C CyrusNajmabadi

Be resilient to exceptions getting thrown.

上级 d8d06b4e
...@@ -77,29 +77,41 @@ internal partial class SQLitePersistentStorage ...@@ -77,29 +77,41 @@ internal partial class SQLitePersistentStorage
// thread for this queue+key, and a TaskCompletionSource we can use to let // thread for this queue+key, and a TaskCompletionSource we can use to let
// other threads know about our own progress writing any new writes in this queue. // other threads know about our own progress writing any new writes in this queue.
var (previousWritesTask, taskCompletionSource) = await GetWriteTaskAsync().ConfigureAwait(false); var (previousWritesTask, taskCompletionSource) = await GetWriteTaskAsync().ConfigureAwait(false);
try
// Wait for all previous writes to be flushed.
await previousWritesTask.ConfigureAwait(false);
if (writesToProcess.Count == 0)
{ {
// No additional writes for us to flush. We can immediately bail out. // Wait for all previous writes to be flushed.
Debug.Assert(taskCompletionSource == null); await previousWritesTask.ConfigureAwait(false);
return;
}
// Now, if we have writes of our own, do them on this thread. if (writesToProcess.Count == 0)
// {
// Note: this flushing is not cancellable. We've already removed the // No additional writes for us to flush. We can immediately bail out.
// writes from the write queue. If we were not to write them out we Debug.Assert(taskCompletionSource == null);
// would be losing data. return;
Debug.Assert(taskCompletionSource != null); }
ProcessWriteQueue(connection, writesToProcess); // Now, if we have writes of our own, do them on this thread.
//
// Note: this flushing is not cancellable. We've already removed the
// writes from the write queue. If we were not to write them out we
// would be losing data.
Debug.Assert(taskCompletionSource != null);
// Mark our TCS as completed. Any other threads waiting on us will now be able ProcessWriteQueue(connection, writesToProcess);
// to proceed. }
taskCompletionSource.TrySetResult(0); catch (OperationCanceledException ex)
{
taskCompletionSource?.TrySetCanceled(ex.CancellationToken);
}
catch (Exception ex)
{
taskCompletionSource?.TrySetException(ex);
}
finally
{
// Mark our TCS as completed. Any other threads waiting on us will now be able
// to proceed.
taskCompletionSource?.TrySetResult(0);
}
return; return;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册