Si vous utilisez la méthode System.Net.WebClient.DownloadFile()
ou System.Net.WebClient.DownloadFileAsync()
alors vous ne pouvez pas mettre en pause le téléchargement. La différence entre ces méthodes est que la dernière méthode démarre un téléchargement asynchrone, donc vous n'aurez pas besoin de créer un thread distinct si vous utilisez cette méthode. Malheureusement, les téléchargements exécutés avec l'une ou l'autre méthode ne peuvent pas être suspendus ou repris. Vous devez utiliser System.Net.HttpWebRequest
. Essayez quelque chose comme ceci:
class Downloader
{
private const int chunkSize = 1024;
private bool doDownload = true;
private string url;
private string filename;
private Thread downloadThread;
public long FileSize
{
get;
private set;
}
public long Progress
{
get;
private set;
}
public Downloader(string Url, string Filename)
{
this.url = Url;
this.filename = Filename;
}
public void StartDownload()
{
Progress = 0;
FileSize = 0;
commenceDownload();
}
public void PauseDownload()
{
doDownload = false;
downloadThread.Join();
}
public void ResumeDownload()
{
doDownload = true;
commenceDownload();
}
private void commenceDownload()
{
downloadThread = new Thread(downloadWorker);
downloadThread.Start();
}
public void downloadWorker()
{
// Creates an HttpWebRequest with the specified URL.
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
FileMode filemode;
// For download resume
if (Progress == 0)
{
filemode = FileMode.CreateNew;
}
else
{
filemode = FileMode.Append;
myHttpWebRequest.AddRange(Progress);
}
// Set up a filestream to write the file
// Sends the HttpWebRequest and waits for the response.
using (FileStream fs = new FileStream(filename, filemode))
using (HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse())
{
// Gets the stream associated with the response.
Stream receiveStream = myHttpWebResponse.GetResponseStream();
FileSize = myHttpWebResponse.ContentLength;
byte[] read = new byte[chunkSize];
int count;
while ((count = receiveStream.Read(read, 0, chunkSize)) > 0 && doDownload)
{
fs.Write(read, 0, count);
count = receiveStream.Read(read, 0, chunkSize);
Progress += count;
}
}
}
}
J'utilise un code de HttpWebRequest.GetResponse page sur MSDN.
Au lieu d'arrêter le fil sur pause et démarrer une nouvelle Tens, vous pouvez également changer la boucle while
attendre jusqu'à ce que le téléchargement est repris comme suit:
while ((count = receiveStream.Read(read, 0, chunkSize)) > 0)
{
fs.Write(read, 0, count);
count = receiveStream.Read(read, 0, chunkSize);
Progress += count;
while(!doDownload)
System.Threading.Thread.Sleep(100);
}
Le bon côté est que vous pouvez être capable de réutiliser le même fil. L'inconvénient est que la connexion peut expirer et se fermer. Dans ce dernier cas, vous devrez le détecter et vous reconnecter.
Vous pouvez également ajouter un événement lorsque le téléchargement est terminé.
Je ne suis pas un expert C#, mais je crois que cela dépendra fortement de ** comment ** vous téléchargez le fichier. Quel est le code actuel dans 'Download()'? – jtbandes
vous devrez probablement mettre fin à la connexion http et le rétablir sur CV. TCP expirera autrement. – sleeplessnerd
Si vous arrêtez le téléchargement, alors vous devez redémarrer, vous devrez également garder la trace de l'endroit où vous vous êtes arrêté et peut-être télécharger et ignorer ces parties, ou recommencer votre téléchargement à nouveau. –