簡體   English   中英

我正在使用Webclient在backgroundworker的“ DoWork”中下載文件

[英]I'm using a webclient to download files inside a backgroundworker's “DoWork”

我猜只能使用Web客戶端。

但是現在我正在使用BackgroundWorker線程和Web客戶端來下載文件。

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滴答事件。

但是也許我可以使用其他方法然后使用計時器來實時檢查子目錄?

這里的想法是在計時器滴答事件中每100ms一直檢查一次gif文件的主目錄和所有子目錄。

規則是首先檢查並找到Israel.gif文件,將其顯示在pictureBox1中,然后將復選框設置為true。

然后,繼續,找到所有子目錄gif文件,並將它們附近的復選框設置為true。 不要在pictureBox1中顯示其他的gif,而只顯示Israel.gif

為什么我這樣問? 因為下載每個gif時我也想顯示一個progressBar或其他指示。 但是,我使用BackgroundWorker和Web客戶端的方式-如何檢查gif的下載時間? 我可以檢查,並且我使用了一個ProgressBar進行整體處理-但是否按gif下載?

這就是為什么我使用timer1的原因。

您可以更改方法:

  • 保持計時器,
  • 不要使用背景工作人員,
  • 在輔助線程中執行文件下載。

在輔助線程中,將下載的文件數和當前下載的文件名以及要顯示的任何其他信息存儲在某個地方(以表格的變量形式)。

使用計時器增加進度條,以顯示正在進行的文件和其他信息。

您無需瀏覽目錄:所有信息都由輔助線程在變量中設置

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM