2009-11-13 2 views
0

나는 간단한 실버 라이트 멀티 파일 업로드 응용 프로그램을 가지고 있으며, 사용자에게 약간의 피드백을 제공하고 싶습니다. 지금은 테스트 단계에만 있으며, 나는 웹 서비스가 없습니다. 어떻게 든 업데이트 UI를 얻을 캔트 :Silverlight, 처리 중 UI 업데이트

private void DoUpload() 
    { 
     foreach (UploadFile file in fileInfos) 
     { 
      int BUFFERSIZE = 1024; 
      int offset = 0; //get from webservice, when partial file 
      FileStream s = file.FileInfo.OpenRead(); 
      byte[] buffer = null; 
      long remainingBytes = s.Length - offset; 
      while (remainingBytes > 0) 
      { 
       if (remainingBytes < BUFFERSIZE) 
       { 
        buffer = new byte[remainingBytes]; 
        BUFFERSIZE = (int)remainingBytes; 
       } 
       else if (remainingBytes > BUFFERSIZE) 
       { 
        buffer = new byte[BUFFERSIZE]; 
       } 

       s.Read(buffer, 0, BUFFERSIZE); 
       //push to webservice 
       offset += BUFFERSIZE; 
       int newPercentage = offset/(int)file.FileInfo.Length * 100; 
       file.Percentage = newPercentage; 
       remainingBytes = s.Length - offset; 
       System.Threading.Thread.Sleep(10); 
      } 
      file.Percentage = 100; 
      file.ImageSource = "accept.png"; 
     } 
    } 

이 파일의 변경이 UI에 반영됩니다 있도록 UploadFile로는, 인터페이스에 바인딩을, 문제는이 모든 업로드 (너무 오래 걸리는 잠을 시뮬레이션이다) 그리고 그 넥타이 UI가 업데이 트되지 않는 동안,이 일을 어떻게 가야하는지에 대한 아이디어?

답변

1

당신이해야 할 일은 새로운 스레드 (즉, UI 스레드가 아님)에서이 메소드를 실행하는 것입니다. UI 스레드 (예 : 잠자기 상태)를 차단하면 사용자를 업데이트하거나 응답하지 못하도록 차단됩니다.

UI에 대해 수정해야하는 경우 은 UI 스레드에서 수행 할입니다. 따라서 UI를 변경해야하고 코드가 다른 스레드에서 실행중인 경우 Dispatcher.BeginInvoke 메서드를 사용하여 UI 스레드에 작업을 전달할 수 있습니다. 다음을 통해 응용 프로그램의 Dispatcher 객체에 액세스 할 수 있습니다. Deployment.Current.Dispatcher.

0

Silverlight는 비동기 호출 만 허용한다고 생각했습니다. 비동기식으로 작업하는 경우 업로드가 UI를 차단하지 않으므로 절전 모드를 사용하는 것이 잘못된 것입니다.

+0

그러나 호출이 비동기이면 imediately 반환하기 때문에 내 피드백을 할 수 없을 것이라고? 반환 사건은 어떻습니까? 어떤 파일이 반환 이벤트의 원본인지 어떻게 알 수 있습니까? 한 번에 여러 파일을 업로드한다고 가정합니다. – H4mm3rHead