2013-08-23 2 views
0

우리는 ftp 서버에서 xml (최대 500kb) 파일을 다운로드하고 업로드하는 프로그램을 만들고 있습니다. 우리는 업로드 화면을 만들어야합니다. 우리는 세 가지 방법을 시도했다. 첫 번째 방법에서는 그림 상자에 넣은 로딩 화면을 보여주는 .gif 파일을 사용했습니다. 그 다음에 up/download 함수를 처리하기 전에 그림 상자를 보이게하고 함수가 끝나면 보이지 않게 만듭니다. 그러나 그것은 작동하지 않았다 :(여기에 코드입니다. 경우 업로드 코드는 작품을 업로드,이 코드를 사용하여화면 업로드 winforms C#

void upload() 
{ 
    FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create("ftp://" + IP + ":" +     Port + downdest + xmlfile); 

    request.Method = WebRequestMethods.Ftp.UploadFile; 
    request.Credentials = new NetworkCredential(username, password); 
    request.UsePassive = true; 
    request.UseBinary = true; 
    request.KeepAlive = false; 

    //Load the file 
    FileStream stream = File.OpenRead("apartman.xml"); 
    byte[] buffer = new byte[stream.Length]; 

    stream.Read(buffer, 0, buffer.Length); 
    stream.Close(); 

    //Upload file 
    Stream reqStream = request.GetRequestStream(); 
    reqStream.Write(buffer, 0, buffer.Length); 
    reqStream.Close(); 
} 

그러나 우리는 사진을 볼 해달라고 : 여기

private void button2_Click(object sender, EventArgs e)//upload button 
{ 

    picturebox1.visible=true; //.gif file 
    upload(); 
    picturebox1.visible=false; 
} 

가 업로드 기능이다는

그런 다음 우리는 멀티 스레딩을 시도했다. 우리가 어느 로딩 화면이 표시되지 않는 작동하지 않습니다,하지만 C#을 우리가 별도의 스레드에서이 코드를 사용하는 것을 허용하지 않습니다.

picturebox1.visible=true; 
,

다음과 같이 말합니다 : "당신은이 bla bla라고 부를 수 없습니다 ...". 기억이 나지 않으며 누락 된 정보에 대해 유감스러운 코드도 삭제되었습니다.

public Form1() 
{ 
    CheckForIllegalCrossThreadCalls = false; 
    InitializeComponent(); 
} 
private void button2_Click(object sender, EventArgs e)//upload button 
{ 
    backgroundWorker1.RunWorkerAsync(); 
} 


private void upload() 
{ 
    backgroundWorker1.ReportProgress(i); 
} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    //upload 
} 

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar1.Value = e.ProgressPercentage; 
} 
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    MessageBox.Show("upload complete"); 
} 

이 코드는 내용의 오류 메시지가 있습니다 :

는 마지막으로 우리가있는 BackgroundWorker를 사용하는 TRED, 여기에 코드입니다

오류 1 파일이 잘못된 값 ","업데이트 "가 : ". path.xml2의 잘못된 문자

로딩 화면을 프로그래밍하는 올바른 방법을 아는 사람이 있습니까?
자세한 내용이 필요하시면 질문에 확실하게 답변 할 수 있습니다.

답변

1

첫 번째 스 니펫의 문제는 UI 스레드가 로딩 이미지의 상태를 변경하는 데 충분한 시간이 없다는 것입니다. 가시성을 변경하여 이미지를 표시하면 즉시 업로드 프로세스가 시작됩니다. UI 스레드를 차단하고 변경 사항을 적용하지 못하도록, 즉로드하는 이미지를 표시합니다.

업로드가 완료되면 즉시 이미지가 숨겨집니다. 그 순간 UI 스레드는 이미지 (보류중인 변경 사항이 적용됨)를 표시하려고 시도하고 그 후에 이미지를 즉시 숨기므로 왜 보이지 않는지 설명합니다.

이 문제를 해결하려면 다른 스레드에서 업로드 프로세스를 이동해야합니다. 어떤 일을 시도했지만 성공하지 못했습니다.

.NET 버전에 따라 여러 가지 방법이 있습니다. 배경 직원은 좋은 사람이고 아마도 가장 좋은 사람입니다. 스레드 컨텍스트 내에서 UI를 업데이트하려면 디스패처를 사용하여 UI를 업데이트해야합니다.

Dispatcher dispUI = Dispatcher.CurrentDispatcher; 
dispUI.BeginInvoke(new Action(() => { 
      //From here you can safely 
      //hide your loading image 
     }), null 
      );