好的,我明白这可能是非常愚蠢的问题,但我之前从未这样做过,所以我问这个问题。我如何使用Thread类下载文件(比方说,从互联网上)?
答案 0 :(得分:1)
“使用Thread类”是什么意思?我想你想要下载一个线程文件,这样它就不会阻止你的UI或程序的其他部分。
我假设你使用的是C ++和WINAPI。 首先创建一个线程。 This tutorial提供了有关WIN32线程的良好信息。 该线程将负责下载文件。要执行此操作,只需连接到端口80上的Web服务器,然后发送所需文件的HTTP GET请求。它可能看起来与此类似(请注意换行符):
GET /path/to/your/file.jpg HTTP/1.1\r\n
Host: www.host.com\r\n
Connection: close\r\n
\r\n
\r\n
然后,服务器将使用包含具有前一标头的文件的HTTP响应进行应答。解析此标题并阅读内容。
答案 1 :(得分:1)
如果建议您不使用线程下载文件。最好使用更多针对I / O的异步构造,因为它们会比线程产生更低的开销。我不知道你正在使用的是什么版本的.NET Framework,但是在4.5中,这样的东西应该可以工作:
private static Task DownloadFileAsync(string uri, string localPath)
{
// Get the http request
HttpWebRequest webRequest = WebRequest.CreateHttp(uri);
// Get the http response asynchronously
return webRequest.GetResponseAsync()
.ContinueWith(task =>
{
// When the GetResponseAsync task is finished, we will come
// into this contiuation (which is an anonymous method).
// Check if the GetResponseAsync task failed.
if (task.IsFaulted)
{
Console.WriteLine(task.Exception);
return null;
}
// Get the web response.
WebResponse response = task.Result;
// Open a file stream for the local file.
FileStream localStream = File.OpenWrite(localPath);
// Copy the contents from the response stream to the
// local file stream asynchronously.
return response.GetResponseStream().CopyToAsync(localStream)
.ContinueWith(streamTask =>
{
// When the CopyToAsync task is finished, we come
// to this continuation (which is also an anonymous
// method).
// Flush and dispose the local file stream. There
// is a FlushAsync method that will flush
// asychronously, returning yet another task, but
// for the sake of brevity I use the synchronous
// method here.
localStream.Flush();
localStream.Dispose();
// Don't forget to check if the previous task
// failed or not.
// All Task exceptions must be observed.
if (streamTask.IsFaulted)
{
Console.WriteLine(streamTask.Exception);
}
});
// since we end up with a task returning a task we should
// call Unwrap to return a single task representing the
// entire operation
}).Unwrap();
}
您可能希望详细说明错误处理。这段代码的作用简而言之:
有关其工作原理的详细说明,请参阅代码注释。