我正在使用webclient在后台工作人员的内容中下载文件" DoWork"

时间:2017-01-07 21:24:31

标签: c# .net winforms

我猜我只能使用网络客户端。

但现在我使用BackgroundWorker线程和网络客户端下载文件。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    var v = lines.Where(s => s.Contains("Name")).Select(s => s.Substring(15));
    var q = lines.Where(s => s.Contains("Code")).Select(s => s.Substring(15));
    var r = q.Where(c => c == "is").Concat(q.Where(c => c != "is"));
    var p = v.Where(c => c == "Israel").Concat(v.Where(c => c != "Israel"));

    var n = r.Count();
    int i = 0;

    var results = p.ToList();

    using (var client = new WebClient())
    {
        foreach (var c in r)
        {
            string filesPath = defaultPath + "\\Countries" + "\\" + results[i] + "\\" + results[i] + ".gif";
            Uri uri = new Uri("http://api.sat24.com/animated/" + c + "/infraPolair/1/JerusalemStandardTime/1897199");
            client.DownloadFile(uri, filesPath);
            backgroundWorker1.ReportProgress(i * 100 / n, results[i]);
            ++i;
        }
    }
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    try
    {
        progressBar1.Value = e.ProgressPercentage;
        label1.Text = e.ProgressPercentage.ToString() + "%";
        label2.Text = e.UserState.ToString();
    }
    catch (Exception ex)
    {
        string ttt = ex.ToString();
    }
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Error == null)
    {
        progressBar1.Value = 100;
    }
    else
    {
    }
}

private void timer1_Tick(object sender, EventArgs e)
{
    DirectoryInfo dir1 = new DirectoryInfo(@"C:\Users\Chocolade\AppData\Local\SatellitesImagesDownloads\SatellitesImagesDownloads\Countries\");
    fi = dir1.GetFiles("*.gif", SearchOption.AllDirectories);

    foreach (FileInfo finfo in fi)
    {
        if (fi.Length > 0 && finfo.Length > 0)
        {
            timer1.Enabled = false;
            pictureBox1.Load(finfo.FullName);

            listView1.Items[0].Checked = true;
        }
    }
}

我昨天问的第一个问题是关于timer1 tick事件。

但也许我可以使用其他方式然后定时器来实时检查子目录?

这里的想法是在计时器tick事件中每隔100ms检查主目录和gif文件的所有子目录。

首先检查规则并找到Israel.gif文件在pictureBox1中显示它并将复选框设置为true。

然后继续并找到所有子目录的gif文件,并将它们附近的复选框设置为true。不要在pictureBox1中显示其他GIF只有以下Israel.gif

为什么我这样问?因为我想在下载每个gif时显示progressBar或其他一些指示。但是我使用BackgroundWorker和网络客户端的方式 - 如何检查何时完全下载gif?我可以检查并且我使用progressBar进行整体处理 - 但是每个gif下载?

这就是我使用timer1的原因。

1 个答案:

答案 0 :(得分:-1)

您可以改变您的方法:

  • 保留计时器,
  • 不要使用背景工作者,
  • 在辅助线程中执行文件下载。

在辅助线程中,存储某个位置(在表单的变量中)下载的文件数和当前下载的文件的名称以及您要显示的任何其他信息。

使用计时器增加进度条,显示正在进行的文件+其他信息。

您无需浏览目录:所有信息都由辅助线程在变量中设置。