2017-01-07 9 views
0

私は推測できるウェブクライアントしか使用できません。私はバックグラウンドワーカーの "DoWork"の中でファイルをダウンロードするためにWebクライアントを使用しています

今、私はファイルをダウンロードするために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イベントに関するものでした。

しかし、おそらく私はいくつかの他の方法を使用して、タイマーをリアルタイムでサブディレクトリをチェックすることができますか?

ここでのアイデアは、タイマーイベントの100msごとにメインディレクトリとgifファイルのすべてのサブディレクトリをチェックすることです。

ルールが最初にチェックされ、Israel.gifファイルがpictureBox1に表示されていることを確認し、チェックボックスをtrueに設定します。

その後、すべてのサブディレクトリgifファイルを見つけて、それらの近くのチェックボックスをtrueに設定します。 pictureBox1に他のGIFを表示しないIsrael.gif

なぜ私はこのようにしていますか?各gifがダウンロードされたときにprogressBarやその他の指示が表示されたかったからです。しかし、私がBackgroundWorkerとウェブクライアントを使用している方法 - gifが完全にダウンロードされたときはどうすれば確認できますか?私は確認することができますし、全体的なプロセスのためにprogressBarを使用しています - しかし、gifのダウンロードごとに?

私はtimer1を使用しています。

+0

多分代わりに、私は/どういうわけかFileSystemWatcherを使用する必要がありますタイマーを使用して? –

+0

'client.DownloadProgressChanged'イベントを使用しようとしましたか?それはsのプロパティを持っています* BytesReceived * –

+0

@ L.B代わりにbackgroundworkerを使用していますか? Webクライアントのみを使用すると、ファイルとイベントを非同期でダウンロードできますか?たぶん私はそれを使用します。 –

答えて

-1

あなたはあなたのアプローチを変更することがあります。

  • ファイルはセカンダリスレッドでダウンロードし、実行、BackgroundWorkerのを使用していない
  • 、タイマーを維持します。

セカンダリスレッドでは、ダウンロードしたファイルの数と現在ダウンロードされているファイルの名前+表示する追加情報をどこかに(フォームの変数で)保存します。

プログレスバーを増分して進行中のファイル+その他の情報を表示するには、タイマーを使用します。

ディレクトリをブラウズする必要はありません。すべての情報は、セカンダリスレッドによって変数に設定されています。

関連する問題