System.Net.WebClient.DownloadFile()
またはSystem.Net.WebClient.DownloadFileAsync()
メソッドを使用する場合、できませんダウンロードを一時停止します。これらのメソッドの違いは、後者のメソッドでは非同期ダウンロードが開始されるため、このメソッドを使用する場合は別途スレッドを作成する必要がないことです。残念ながら、いずれの方法で実行されたダウンロードも一時停止または再開できません。
System.Net.HttpWebRequest
を使用する必要があります。
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;
}
}
}
}
私はHttpWebRequest.GetResponseのコードをMSDNで使用しました。
代わりに一時停止のスレッドを停止し、再開に新しいものを始めるので、あなたもダウンロードが次のように再開されるまで待つようにwhile
ループを変更することができます。
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);
}
アップ側は、あなたがかもしれないということです同じスレッドを再利用できるようにする。下側は、接続がタイムアウトして閉じられることです。後者の場合、これを検出して再接続する必要があります。
donwloadが完了したときにイベントを追加することもできます。
私はC#のエキスパートではありませんが、これは*ファイルのダウンロード方法*に依存します。 'Download()'の実際のコードは何ですか? – jtbandes
http接続を終了し、再開時に再確立する必要があるでしょう。それ以外の場合はTCPがタイムアウトします。 – sleeplessnerd
ダウンロードを停止すると、再起動する必要があります。また、停止した場所を追跡し、それらの部分をダウンロードして無視するか、ダウンロードをもう一度やり直す必要があります。 –