none
while 구문 에서 이벤트가 작동하지 않습니다. RRS feed

  • 질문

  • private void button1_Click(object sender, EventArgs e)
            {
                while (fileCount < FileList.Count)
                {
                    if (!IsDown)
                    {
                        FileDownload();
                    }
                }
            }
            private void FileDownload()
            {
                string fileUri = FilePath[fileCount].ToString().Replace('/', '\\');
                string fileName = FileList[fileCount].ToString();
                int fileSize = (int)GetFileSize(ftpServerUri + fileUri + fileName);
                fileCount++; //전역변수
                IsDown = true;
                progressBar1.Maximum = fileUpdate.FileList.Count;
                progressBar1.Step = 1;
                progressBar2.Maximum = fileSize;
               
                wc.Credentials = new NetworkCredential("aaa", "");
                wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
                wc.DownloadFileCompleted += new AsyncCompletedEventHandler(FileCompleted);
                wc.DownloadFileAsync(new Uri(ftpServerUri + fileUri + fileName), Application.StartupPath + @"\" + fileUri + fileName);
            }
            private void FileCompleted(object sender, AsyncCompletedEventArgs e)
            {
                progressBar1.PerformStep();
                progressBar2.Value = 0;
                IsDown = false;
            }

            private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
            {
                progressBar2.Value = (int)e.BytesReceived;
            }

    해당 소스를 보면 간단한 다운로드 소스 입니다. 하지만 여러개를 다운로드 받기위해서 While문으로 반복을 하고 있는데요.

    연속 다운로드를 방지하기위해 IsDown 불리언으로 체크를 하면서 해당 파일이 다운로드가 다된것을 확인하는데.

    문제가 이 다운로드 컴플리트 이벤트가 호출이 되지 않습니다.콜백이라고 해야하나요? 테스트를 위해 txt파일을 다운로드 하게했는데

    파일은 다운은 다받아졌지만 완료 이벤트가 먹히지가 않습니다. 무슨 문제일까요... 그때문에 while에서 벗어나지도 못해 멈춰버립니다. 

    제가 아직 깨닫지 못한게 있는걸까요?? 어떻게 해야할까요?

    2019년 1월 25일 금요일 오후 1:30

모든 응답

  • FileCompleted가 실행이 되려면 DownloadFileAsync button1_Click을 실행하고 스레드가 자유로워야 합니다. 즉, 해당 스레드가 다른 일을 할 수 없는 상태이기 때문에 WebClient는 FileCompleted를 호출하라고 Invoke를 했지만 정작 대상 스레드는 현재 다른 while 문을 처리하느라 FileCompleted 이벤트 호출을 못하고 있는 것입니다.

    아래의 문제와 비슷한 유형인데,

    두 개의 윈도우를 각각 실행하는 방법(Windows Forms, WPF)
    ; http://www.sysnet.pe.kr/2/0/11802

    WebClient 다운로드를 아예 스레드에서 처리하도록 만들거나... 하는 등의 부가 작업이 필요합니다. (또는, button1_Click을 실행 중인 스레드를 while 문으로 중지시키지 않도록 코드를 재구성해야 합니다.)

    2019년 1월 28일 월요일 오전 2:42