Make sure to dispose stuffs

This commit is contained in:
Jaex 2016-12-26 20:23:29 +03:00
parent 8161d1440a
commit a912197056
3 changed files with 76 additions and 68 deletions

View File

@ -59,11 +59,7 @@ namespace ShareX.HelpersLib
public IWebProxy Proxy { get; set; }
public string AcceptHeader { get; set; }
public event EventHandler FileSizeReceived;
public event EventHandler DownloadStarted;
public event EventHandler ProgressChanged;
public event EventHandler DownloadCompleted;
public event EventHandler ExceptionThrowed;
public event EventHandler FileSizeReceived, DownloadStarted, ProgressChanged, DownloadCompleted, ExceptionThrowed;
private BackgroundWorker worker;
private Stream stream;
@ -84,11 +80,6 @@ namespace ShareX.HelpersLib
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
IsDownloading = false;
}
public void StartDownload()
{
if (!IsDownloading && !string.IsNullOrEmpty(URL) && !worker.IsBusy)
@ -123,10 +114,13 @@ namespace ShareX.HelpersLib
}
}
private void ThrowEvent(EventHandler eventHandler)
{
worker.ReportProgress(0, eventHandler);
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
HttpWebResponse response = null;
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
@ -138,65 +132,73 @@ namespace ShareX.HelpersLib
request.Accept = AcceptHeader;
}
response = (HttpWebResponse)request.GetResponse();
FileSize = response.ContentLength;
ThrowEvent(FileSizeReceived);
if (FileSize > 0)
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
Stopwatch timer = new Stopwatch();
Stopwatch progressEventTimer = new Stopwatch();
long speedTest = 0;
FileSize = response.ContentLength;
byte[] buffer = new byte[(int)Math.Min(bufferSize, FileSize)];
int bytesRead;
ThrowEvent(FileSizeReceived);
ThrowEvent(DownloadStarted);
while (DownloadedSize < FileSize && !worker.CancellationPending)
if (FileSize > 0)
{
while (IsPaused && !IsCanceled)
{
timer.Reset();
Thread.Sleep(10);
}
Stopwatch timer = new Stopwatch();
Stopwatch progressEventTimer = new Stopwatch();
long speedTest = 0;
if (IsCanceled)
{
return;
}
byte[] buffer = new byte[(int)Math.Min(bufferSize, FileSize)];
int bytesRead;
if (!timer.IsRunning)
using (stream)
using (Stream responseStream = response.GetResponseStream())
{
timer.Start();
}
ThrowEvent(DownloadStarted);
if (!progressEventTimer.IsRunning)
{
progressEventTimer.Start();
}
while (DownloadedSize < FileSize && !worker.CancellationPending)
{
while (IsPaused && !IsCanceled)
{
timer.Reset();
Thread.Sleep(10);
}
bytesRead = response.GetResponseStream().Read(buffer, 0, buffer.Length);
stream.Write(buffer, 0, bytesRead);
DownloadedSize += bytesRead;
speedTest += bytesRead;
if (IsCanceled)
{
return;
}
if (timer.ElapsedMilliseconds > 500)
{
DownloadSpeed = (double)speedTest / timer.ElapsedMilliseconds * 1000;
speedTest = 0;
timer.Reset();
}
if (!timer.IsRunning)
{
timer.Start();
}
if (!progressEventTimer.IsRunning)
{
progressEventTimer.Start();
}
bytesRead = responseStream.Read(buffer, 0, buffer.Length);
stream.Write(buffer, 0, bytesRead);
DownloadedSize += bytesRead;
speedTest += bytesRead;
if (timer.ElapsedMilliseconds > 500)
{
DownloadSpeed = (double)speedTest / timer.ElapsedMilliseconds * 1000;
speedTest = 0;
timer.Reset();
}
if (progressEventTimer.ElapsedMilliseconds > 100)
{
ThrowEvent(ProgressChanged);
progressEventTimer.Reset();
}
}
if (progressEventTimer.ElapsedMilliseconds > 100)
{
ThrowEvent(ProgressChanged);
progressEventTimer.Reset();
ThrowEvent(DownloadCompleted);
}
}
ThrowEvent(ProgressChanged);
ThrowEvent(DownloadCompleted);
}
}
catch (Exception ex)
@ -204,14 +206,10 @@ namespace ShareX.HelpersLib
if (!IsCanceled)
{
LastException = ex;
ThrowEvent(ExceptionThrowed);
}
}
finally
{
if (response != null) response.Close();
if (stream != null) stream.Close();
}
}
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
@ -224,9 +222,9 @@ namespace ShareX.HelpersLib
}
}
private void ThrowEvent(EventHandler eventHandler)
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
worker.ReportProgress(0, eventHandler);
IsDownloading = false;
}
}
}

View File

@ -175,7 +175,11 @@ namespace ShareX.UploadersLib
{
if (response != null)
{
response.GetResponseStream().CopyStreamTo(downloadStream, BufferSize);
using (Stream responseStream = response.GetResponseStream())
{
responseStream.CopyStreamTo(downloadStream, BufferSize);
}
return true;
}
}
@ -243,7 +247,11 @@ namespace ShareX.UploadersLib
requestStream.Write(bytesDataClose, 0, bytesDataClose.Length);
}
result.Response = ResponseToString(request.GetResponse(), responseType);
using (WebResponse response = request.GetResponse())
{
result.Response = ResponseToString(response, responseType);
}
result.IsSuccess = true;
}
catch (Exception e)
@ -477,7 +485,8 @@ namespace ShareX.UploadersLib
switch (responseType)
{
case ResponseType.Text:
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
using (Stream responseStream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8))
{
return reader.ReadToEnd();
}

View File

@ -132,7 +132,8 @@ namespace ShareX.UploadersLib.FileUploaders
private UploadResult HandleDuplicate(HttpWebResponse httpResponse)
{
JToken response;
using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream()))
using (Stream responseStream = httpResponse.GetResponseStream())
using (StreamReader streamReader = new StreamReader(responseStream))
{
response = JToken.Parse(streamReader.ReadToEnd());
}