2012-05-02 2 views
-1

C#으로의 WinForm에서 일을 해달라고 이벤트는 콘솔 응용 프로그램에서 만의 WinForm에서 작업하는 videoDownloader_DownloadFinished일부 이벤트는 내가 YoutubeExtractor의 dll을 .. videoDownloader_ProgressChanged을 사용하고

private void btnStart_Click(object sender, EventArgs e) 
    { 


     string link = textBox1.Text; 
     start(link); 

    } 

    static void start(string link) 
    { 
     IEnumerable<VideoInfo> videoInfos = DownloadUrlResolver.GetDownloadUrls(link); 

     DownloadVideo(videoInfos); 
    } 

    private static void DownloadVideo(IEnumerable<VideoInfo> videoInfos) 
    { 
     VideoInfo video = videoInfos 
      .First(info => info.VideoFormat == VideoFormat.Standard360); 

     var videoDownloader = new VideoDownloader(video, Path.Combine("C:/Downloads", video.Title + video.VideoExtension)); 
     videoDownloader.DownloadFinished += new EventHandler(videoDownloader_DownloadFinished); 

     videoDownloader.ProgressChanged += new EventHandler<ProgressEventArgs>(videoDownloader_ProgressChanged); 
     videoDownloader.Execute(); 
    } 

    static void videoDownloader_ProgressChanged(object sender, ProgressEventArgs e) 
    { 
        //some code.. 
    } 

    static void videoDownloader_DownloadFinished(object sender, EventArgs e) 
    { 
     //some code.. 

    } 

내 두 번째 질문은 정적 videoDownloader_ProgressChanged 이벤트에서 양식 컨트롤에 액세스하려고합니다. e.ProgressPercentage 매개 변수를 통해 다운로드 한 비디오의 비율을 알 수 있습니다. 레이블에 표시하고 싶습니다. 하지만 정적 이벤트 때문에 액세스 레이블이 없습니다 .. 대리자를 사용하려고했지만 아무 것도 변경되지 않았습니다.

+0

정적을 사용하는 이유는 무엇입니까? – Likurg

+0

GUI 이벤트 핸들러에서 'videoDownloader.Execute()'와 같은 메서드를 호출하는 것은 매우 나쁜 생각입니다. 그것은 무엇을하며 더 중요한 것은 얼마나 걸리나요? 인간이 눈에 띄는 시간이 필요하다면 꺼내십시오. 변경된/완료된 핸들러에서 BeginInvoke()를 수행해야합니다. –

+0

어떤 구성 요소를 사용하고 있는지 명확하지 않습니다. 지원을 받으려면 소유자 또는 작성자에게 문의해야합니다. –

답변

0

Start() 및 DownloadVideo() 루틴을 모두 인스턴스 메서드로 수정하십시오. 그들과 이벤트 처리기에서 '정적'키워드를 제거하십시오.

+0

제안 해 주셔서 감사합니다. – unbalanced

0

변경/완료 처리기에서 'videoDownloader.Execute()'및 BeginInvoke()를 스레드 해제합니다.

GUI 이벤트 핸들러에서 영원히 (컴퓨터 용어로) 취하는 메서드를 호출하지 마십시오. 약 50ms 이상 걸리면 처리하지 마십시오. 모든 그물, 예. 'YouTube'가 포함 된 콘텐츠는 연결을 설정하는 것보다 오래 걸립니다!

+0

비디오를 다운로드하는 데 약 10 초가 걸린다. 나는 그것이 좋은 코드가 아니라는 것을 안다. 그리고 나는 당신이 쓴 것을 분명히 이해하지 못한다. 나는 쓰레드를 사용해야 만한다? 이벤트는 어떨까요? 감사합니다. – unbalanced

+0

GUI 이벤트 핸들러에서 장기 실행 및/또는 블로킹 호출을해서는 안됩니다. 그렇게하면 GUI 스레드는 호출이 끝나고 이벤트 핸들러가 종료 될 때까지 입력 대기열에 게시 된 메시지를 처리 ​​할 수 ​​없습니다. 즉, 키보드 메시지, 마우스 메시지, 메시지 다시 그리기 등을 처리하지 않아도됩니다. 진행 막대 등의 시각적 속성을 원하는대로 변경할 수 있습니다. 차단 된 이벤트 처리기가 종료 될 때까지 디스플레이에 아무 것도 렌더링되지 않습니다. 이벤트는? - 이벤트가 작동하려면 일부 스레드가 호출 할 수 있어야합니다. –

+0

오케이 thnk 당신은 당신의 ansewer를 위해 .. 지금은 분명히 .. 나는 스레드를 사용하려고합니다 .. 또는 당신은 어떤 제안이 있습니까? – unbalanced

관련 문제