2013-08-23 42 views
0

我們正在製作一個程序,從ftp服務器下載並上傳一個xml(最大500kb)文件。我們需要製作一個上傳屏幕。我們嘗試了三種方法。在第一種方法中,我們使用了一個.gif文件,該文件顯示了我們在圖片框中放置的加載屏幕。之後,在我們處理上/下載函數之前,我們使圖片框可見,並且當函數完成時,我們使其不可見。但是,這並不工作:(這裏是代碼:上傳屏幕winforms c#

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

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

下面是上傳功能:

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(); 
} 

使用此代碼,上傳作品,但我們沒有看到圖片上載代碼。不工作,我們看不到加載屏幕無論是。

然後我們嘗試了多線程,但是C#不允許我們在一個單獨的線程中使用此代碼。

picturebox1.visible=true; 

它說的是這樣的:「你不能也稱這個bla bla ...」。我不記得也刪除了代碼,因此對於缺少的信息感到抱歉。

最後,我們TRED使用BackgroundWorker的,這裏是代碼:

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"); 
} 

此代碼還給出了一條錯誤消息:

錯誤1文件具有無效值「」更新」 :」。 path.xml2中的非法字符

有沒有人知道編程加載屏幕的正確方法?
如果你需要更多的細節,我一定能回答你的問題。

回答

1

您的第一個片段中的問題是,UI線程沒有足夠的時間來更改加載圖像的狀態:當您通過更改其可見性來顯示圖像時,立即啓動上載過程,阻止UI線程並阻止它使您的更改生效,也就是顯示您的加載映像。

上傳完成後,您立即隱藏圖像。此時,UI線程會嘗試顯示您的圖像(待執行的更改生效),然後立即隱藏圖像,這就解釋了爲什麼您永遠不會看到它。

要糾正此問題,您需要將上載過程移到另一個線程中。你試圖做,但沒有成功,以使其工作。

有很多方法可以根據你的.NET版本來做到這一點。後臺工作人員很好,可能是你最好的選擇。只要確保,無論何時您想從線程上下文中更新UI,您都使用調度程序對其進行更新:

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