2017-01-07 3 views
0

웹 클라이언트 만 사용할 수 있습니다.웹 클라이언트를 사용하여 백그라운드 작업자의 "DoWork"파일을 다운로드합니다.

하지만 지금은 파일 다운로드를 위해 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 틱 이벤트에 관한 것입니다.

하지만 다른 방법으로 타이머를 사용하여 실시간으로 하위 디렉토리를 확인할 수 있습니까?

여기에있는 아이디어는 타이머 틱 이벤트의 모든 100ms마다 기본 디렉토리와 모든 하위 디렉토리에서 gif 파일을 확인하는 것입니다.

규칙은 먼저 확인하고 Israel.gif 파일이 pictureBox1에 표시되는지 확인하고 확인란을 true로 설정합니다.

그런 다음 계속해서 모든 하위 디렉토리 gif 파일을 찾아서 그 근처에있는 확인란을 true로 설정하십시오. pictureBox1에 다른 gif를 표시하지 마십시오 Israel.gif

왜 내가 이런 식으로 물어 보는거야? 왜냐하면 각 GIF가 다운로드 될 때 progressBar 또는 다른 표시를 표시하고 싶었 기 때문입니다. 그러나 내가 BackgroundWorker과 웹 클라이언트를 사용하는 방법 - 어떻게하면 gif가 완전히 다운로드되었는지 확인할 수 있습니까? 확인할 수 있고 전체 프로세스에 progressBar를 사용하고 있지만 gif 다운로드 당하나요?

그래서 저는 timer1을 사용하고 있습니다.

+0

어쩌면 대신 타이머를 사용하여 어떻게 든 FileSystemWatcher를 사용할 수 있습니까? –

+0

'client.DownloadProgressChanged' 이벤트를 사용해 보셨습니까? 그것은 속성이 있습니다 * BytesReceived * –

+0

@ L.B 대신 backgroundworker를 사용하고 계십니까? 웹 클라이언트 만 사용하려면 비동기 다운로드 파일과 이벤트가 필요합니까? 아마 내가 그것을 사용할 것이다. –

답변

-1

당신은 당신의 접근 방식을 변경할 수 있습니다 :

  • 타이머를 유지,
  • 가있는 BackgroundWorker를 사용하지 않는,
  • 이 파일이 보조 스레드에서 다운로드하여 실행합니다.

보조 스레드에서 다운로드 할 파일 수와 현재 다운로드 한 파일의 이름 + 표시하려는 추가 정보를 양식의 변수에 저장하십시오.

진행률 표시 줄을 증가 시키려면 타이머를 사용하고 진행중인 파일 및 기타 정보를 표시하십시오.

디렉토리를 탐색 할 필요가 없습니다. 모든 정보는 보조 스레드에 의해 변수로 설정됩니다.

관련 문제