2009-11-14 4 views
3

나는이 클래스를 가지고있다. 나는 웹 서비스를 사용하여 이것을하고있다. 내 UI에서 양방향 바인딩을 만들었으므로 이제 파일을 업로드하려고합니다. 나는 문제는 내가 UI, 또는 크로스 스레드 작업을 업데이트 할 수 있다는 것입니다이 코드실버 크로스 스레드의 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 
       Thread.Sleep(20); 
       //UploadService.Service1SoapClient client = new MultiLargeFileUpload.UploadService.Service1SoapClient(); 
       //client.LargeUploadCompleted +=new EventHandler<AsyncCompletedEventArgs>(client_LargeUploadCompleted); 
       //client.LargeUploadAsync(1, buffer, file.Name); 
       offset += BUFFERSIZE; 
       int newPercentage = offset/(int)file.FileInfo.Length * 100; 
       file.Percentage = newPercentage; 
       remainingBytes = s.Length - offset;      
      } 
      //file.Percentage = 100; 
      //file.ImageSource = "accept.png"; 
     } 
    } 

를 사용하여이 일을하고있다. Dispatcher를 사용하려고했지만 삽입 할 위치를 알지 못했기 때문에 성공적이지 못했습니다.

답변

5

나는 당신이 당신의 UI의 갱신을하려는 생각

  file.Percentage = newPercentage; 
      remainingBytes = s.Length - offset; 
당신은 다른에서 UI를 업데이트하려면이에 Dispatcher.BeginInvoke을 대리인이 포장하고,해야 할 것이다

스레드 :

Dispatcher.BeginInvoke(()=>{ 
    file.Percentage=newPercentage; 
    remainingBytes = s.Length - offset; 
}); 

메인 스레드에서 MessageQueue가 메시지를 보내 이러한 방법으로, 그가 시간을 가질 때 대리자를 실행할 수있는 메인 스레드.