C# 在BackgroundWorker内部重用下载文件时遇到问题
我有一个简单的课程:C# 在BackgroundWorker内部重用下载文件时遇到问题,c#,winforms,download,C#,Winforms,Download,我有一个简单的课程: public class DownloadFile { ... public string GetFile(string fileUrl, string pathOut) { using (WebClient wc = new WebClient()) { wc.DownloadFile(new Uri(fileUrl), pathOut); return pathOu
public class DownloadFile
{
...
public string GetFile(string fileUrl, string pathOut)
{
using (WebClient wc = new WebClient())
{
wc.DownloadFile(new Uri(fileUrl), pathOut);
return pathOut;
}
}
}
我从一个BackgroundWorker
2次调用它,因为过程是下载并安装2个文件(在这里进行自定义安装)
问题是,第一个文件正常下载和安装,但第二个文件挂在wc2.DownloadFile(新Uri(fileUrl),pathOut)上代码>行和永远不会从那里得到的
使用使用
我每次使用时都会处理网络客户端
,因此我可以说:
// Created BackgroundWorker so the UI doesn't get blocked and I can
// can show the progress in a log...
BackgroundWorker bkWrk = new BackgroundWorker();
bkWrk.WorkerReportsProgress = true;
bkWrk.ProgressChanged += (s, e) =>
{
ReportProgress(String.Format("Progress: {0}%", e.ProgressPercentage));
};
bkWrk.DoWork = delegate {
DownloadFile fileManager = new DownloadFile();
fileManager.GetFile("http://domain.com/file_A.zip", "C:\\TEMP\\file_a.zip");
fileManager.GetFile("http://domain.com/file_B.zip", "C:\\TEMP\\file_b.zip");
};
bkWrk.RunWorkerAsync();
while(bkWrk.IsBusy)
{
// let's wait but fire all events
Application.DoEvents();
}
我看这里没有什么问题。。。但事实是,该文件挂起在DownloadFile
方法上,甚至尝试使用Microsoft符号在方法内部导航,但都没有成功
甚至在请求中添加了一个头,但问题仍然存在
wc.Headers["User-Agent"] = "Mozilla/4.0 (Compatible; Windows NT 5.1; MSIE 6.0)" +
" (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
我是不是漏掉了什么明显的东西
DownloadFile文件管理器=新建DownloadFile();
fileManager.GetFile(“http://domain.com/file_A.zip",
“C:\TEMP\file_a.zip”);
fileManager.GetFile(“http://domain.com/file_B.zip",
“C:\TEMP\file_b.zip”)
您知道wc.DownloadFile不是异步方法,对吗?这意味着您的后台工作人员必须先下载第一个文件,然后再下载第二个文件,然后才能完成其工作
它确实。。。更大的问题是,有时它会同时下载两个文件
没有问题:-/-
这只意味着您等待两个操作完成的时间足够长。第二个文件是否存在?我知道这是一个显而易见的问题,但你必须问!它确实。。。更大的问题是,有时它下载两个文件时都不会出现问题:-/尝试使GetFile方法保持静态对于WebClient来说,没有这样的记录故障模式。在主线程上工作正常吗?您是否消除了服务器的问题?在BackgroundWorker
中,我编写了调用这两个方法的显式代码,因为调用发生在BackgroundWorker
中,第二个GetFile()
将始终仅在第一个方法结束时触发。-我添加了包装GetFile
的bkWrk代码,BackgroundWorker将在异步操作系统中一个接一个地下载这两个文件。DownloadFile不是异步操作系统。您想使用的是这是一种更好的方法,我不想使用DownloadFileAsync
,它将在每个文件上调用线程,我已经从BackgroundWorker
中找到了一个线程,如果我希望在BackgroundWorker
中以同步模式进行操作,那么就不需要继续创建线程。如果您希望同步操作,那么就不需要使用异步(这样更简单)。但异步方法不会创建新线程,而是使用。