下载应用程序时,它会在这个过程中随机跳转一个文件

本文关键字:文件 一个 随机 过程中 下载 应用程序 | 更新日期: 2023-09-27 18:04:08


我正在开发一个c#patcher,它的作用是比较客户端和服务器的文件,如果有不一致的地方,它会自动下载
它是一个WPF应用程序,为了在更新进度条的同时处理多个异步下载,我使用了net4.5async/await
它工作得很好,但现在我需要让同一个应用程序在windowsxp上运行,我决定使用BackgroundWorker重构所有代码,这在net4中也是可以解决的,net4是xp支持的最后一个

问题是一个文件(一个特定的文件(一开始没有下载
当有3个不同的文件下载时,例如,如果有问题的文件是第二个,在第一个文件之后,下载开始,但它几乎立即跳到第三个文件,第二个文件的大小为0KB
如果有问题的文件是第一个或最后一个,则结果是相同的。好像节目不喜欢它。
在进行了一些更改后,我决定回滚我所做的所有内容,返回到最初的代码
现在我没有问题了,所有的文件都下载正确,但有趣的是,如果我把同一个可执行文件交给另一个人,他仍然有和我一样的问题
我不知道怎么可能,这个文件和其他文件完全一样

软件的其他一些信息:
在开始时,程序检查所有文件是否相同,将每个文件的MD5哈希与更新文件的所有MD5哈希的文件进行比较(之前使用php脚本生成(
现在,如果有一些文件要下载,程序会将这些文件注入到窗口中,最后一个会将它们注入HTTPDownloader(如果有的话(
HTTPDownload使用for循环开始下载所有文件,whiling for client.isBusy用于确保不执行并行I/O操作
有一个DownloadListener,它监听所有WebClient事件和一些自定义。它使用Dispatcher更新进度条、状态文本块等,因为事件将在另一个线程中触发(通过HTTPDownloader(
之后发生的事情对于这个特定的问题来说并不重要。

以下是感兴趣的文件:

window.xaml.cs

public void repairButtonClick(object sender, RoutedEventArgs e)
{
    repairButton.IsEnabled = false;
    startButton.IsEnabled = false;
    currentFile.Text = "Hashing files...";
    BackgroundWorker bw = new BackgroundWorker();
    bw.DoWork += (object s, DoWorkEventArgs es) =>
    {
        scanner.search();
    };
    bw.RunWorkerCompleted += (object s, RunWorkerCompletedEventArgs ev) =>
     {
         toUpdateFiles = scanner.getToUpdateFiles();
         if (toUpdateFiles != null && toUpdateFiles.Count > 0)
         {
             _startDownload();
         }
         else
         {
             currentFile.Text = "";
             System.Windows.MessageBox.Show(this, "Your client is OK!", "Patcher");
             startButton.IsEnabled = true;
         }
     };
    bw.RunWorkerAsync();
}

这是一个点击事件处理程序,没有问题,但它调用了_startDownload方法

window.xaml.cs

void _startDownload()
{
    HTTPDownloader downloader = new HTTPDownloader(toUpdateFiles, client,"source/");
    DownloadListener listener = new DownloadListener(this, downloader);
    BackgroundWorker bw = new BackgroundWorker();
    bw.DoWork += (object s, DoWorkEventArgs e) =>
    {
        downloader.startDownload();
    };
    bw.RunWorkerAsync();
}

HTTPDownloaderWebClient的包装器
DownloadListener是一个侦听器,它侦听WebClient的所有下载事件(以及一些自定义(
BackgroundWorker运行HTTPDownloader.startDownload()方法

HTTPDownloader.cs

public void startDownload()
{
    if (Progress != null) client.DownloadProgressChanged += Progress;
    if (Completed != null) client.DownloadFileCompleted += Completed;
    if (client.BaseAddress.Length == 0)
    {
        throw new Exception("BaseAddress missing in the WebClient Object");
    }
    for (int i = 0; i < files.Count; i++)
    {
        PatchFile file = files[i];
        setCurrentIndex(i + 1);
        OnNewFile(file);
        setCurrentFile(file);
        string path = Path.Combine(file.getBasePath(), file.getName());
        string downloadPath = basePath + path;
        if (file.basePath != String.Empty) Directory.CreateDirectory(Path.GetDirectoryName(path));
        client.DownloadFileAsync(new Uri(new Uri(client.BaseAddress), downloadPath), path);
        while (client.IsBusy)
        {
        }
        OnAfterNewFile(file);

    }
    OnAllFileDownloaded();
}

我们来了,这是最重要的方法
它下载所有文件,引发一些事件
(一个离题的问题:while(client.isBusy)是等待下载完成再启动另一个的好方法吗?(用于不引发I/O WebClient异常(

请帮帮我,我太倾斜了。同一个可执行文件在我和其他计算机上以另一种方式运行是毫无意义的
也许线程是以不同的方式管理的,我不知道,我对应用程序编程还很陌生(所以,如果我的window.xaml.cs有一些业务逻辑,并且我使用了一种单独的方式来处理ui(DownloadListener(,当我看到MVVC模式时,它已经过时了,不要责怪我(。

感谢

下载应用程序时,它会在这个过程中随机跳转一个文件

解决了问题,是主机对文件有问题