From 7299ccbe983cbca644d3305268f93f847217e0d0 Mon Sep 17 00:00:00 2001 From: Aurimas Cernius Date: Tue, 19 Nov 2019 19:02:31 +0200 Subject: [PATCH] Make present download sotre thread safe --- BackgroundDownload/BackgroundDownload.cs | 45 +++++++++++-------- .../BackgroundDownloadAndroid.cs | 7 ++- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/BackgroundDownload/BackgroundDownload.cs b/BackgroundDownload/BackgroundDownload.cs index 4dafa21..8d11d08 100644 --- a/BackgroundDownload/BackgroundDownload.cs +++ b/BackgroundDownload/BackgroundDownload.cs @@ -67,12 +67,15 @@ public static BackgroundDownload[] backgroundDownloads { get { - LoadDownloads(); - var ret = new BackgroundDownload[_downloads.Count]; - int i = 0; - foreach (var download in _downloads) - ret[i++] = download.Value; - return ret; + lock (typeof(BackgroundDownload)) + { + LoadDownloads(); + var ret = new BackgroundDownload[_downloads.Count]; + int i = 0; + foreach (var download in _downloads) + ret[i++] = download.Value; + return ret; + } } } @@ -90,13 +93,16 @@ public static BackgroundDownload Start(Uri url, String filePath) public static BackgroundDownload Start(BackgroundDownloadConfig config) { - LoadDownloads(); - if (_downloads.ContainsKey(config.filePath)) - throw new ArgumentException("Download of this file is already present"); - var download = new BackgroundDownloadimpl(config); - _downloads.Add(config.filePath, download); - SaveDownloads(); - return download; + lock (typeof(BackgroundDownload)) + { + LoadDownloads(); + if (_downloads.ContainsKey(config.filePath)) + throw new ArgumentException("Download of this file is already present"); + var download = new BackgroundDownloadimpl(config); + _downloads.Add(config.filePath, download); + SaveDownloads(); + return download; + } } protected BackgroundDownload() @@ -131,12 +137,15 @@ protected BackgroundDownload(BackgroundDownloadConfig config) public virtual void Dispose() { - _downloads.Remove(_config.filePath); - SaveDownloads(); - if (_status == BackgroundDownloadStatus.Downloading) + lock (typeof(BackgroundDownload)) { - _status = BackgroundDownloadStatus.Failed; - _error = "Aborted"; + _downloads.Remove(_config.filePath); + SaveDownloads(); + if (_status == BackgroundDownloadStatus.Downloading) + { + _status = BackgroundDownloadStatus.Failed; + _error = "Aborted"; + } } } diff --git a/BackgroundDownload/BackgroundDownloadAndroid.cs b/BackgroundDownload/BackgroundDownloadAndroid.cs index 6faa9eb..fcbbb75 100644 --- a/BackgroundDownload/BackgroundDownloadAndroid.cs +++ b/BackgroundDownload/BackgroundDownloadAndroid.cs @@ -22,8 +22,11 @@ public Callback() void downloadCompleted() { - foreach (var download in _downloads.Values) - ((BackgroundDownloadAndroid)download).CheckFinished(); + lock (typeof(BackgroundDownload)) + { + foreach (var download in _downloads.Values) + ((BackgroundDownloadAndroid) download).CheckFinished(); + } } }