2013-02-13 71 views
-2

我有一個連接到服務器的簡單登錄表單。顯示試圖連接服務器時加載動畫

當用戶按下登錄按鈕時,動畫加載GIF需要顯示,直到連接已建立或失敗。

從理論上講,我做到了:

private void button_login_Click(object sender, EventArgs e) 
{ 
     button_login.Text = WORKING; 
     Loading(ShowMode.show, pictureBox_login_loading); 
     // send request   
     client = new TcpClient(); 
     try 
     { 
      IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000); 
      client.Connect(endPoint); 
      // send login details .. :) 
      output = client.GetStream(); 
      writer = new BinaryWriter(output); 
      reader = new BinaryReader(output); 
      // write details 
      writer.Write("login" "|" userID "|" privateName); 
     } 
     catch (Exception) 
     { 
      MessageBox.Show("Server is down."); 
      return; 

     } 
     finally 
     { 
      // Stop loading and return status 
      button_login.Text = DEFAULT_LOGIN_TEXT; 
      Loading(ShowMode.hide, pictureBox_login_loading); 
     } 
} 

加載的是,圖片框的Visible屬性設置爲Visible功能。 (我認爲這會有所幫助)

問題是:gif只有在button_login_Click完成其運行後纔可見,並且在它看不見之後。

如何使動畫gif在執行的行上可見?

回答

3

問題是你不回退到GUI線程,所以沒有能力顯示你的GIF。

我建議使用BackgroundWorker連接到您的客戶端,然後在開始工作之前顯示GIF並在工作人員完成的呼叫中停止它。

示例代碼(注意,我沒有編譯這個,因爲我沒有你的源充足的話):

 button_login.Text = WORKING; 
     Loading(ShowMode.show, pictureBox_login_loading); 
     // send request  
     BackgroundWorker worker = new BackgroundWorker(); 

     worker.DoWork += new DoWorkEventHandler((obj, args) => 
     { 
      client = new TcpClient(); 
      try 
      { 
       IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000); 
       client.Connect(endPoint); 
       // send login details .. :) 
       output = client.GetStream(); 
       writer = new BinaryWriter(output); 
       reader = new BinaryReader(output); 
       // write details 
       writer.Write("login" "|" userID "|" privateName); 
      } 
      catch (Exception) 
      { 
       this.Invoke(new Action(() =>MessageBox.Show("Server is down.")); 
      } 
     }); 

     worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler((obj, args) => 
     { 
      button_login.Text = DEFAULT_LOGIN_TEXT; 
      Loading(ShowMode.hide, pictureBox_login,loading); 
     }); 

     worker.RunWorkerAsync(); 

這種方法產生的GUI線程使其能夠顯示您的GIF並且仍然監控您的連接,並在完成後刪除GIF和恢復按鈕文本。

0

由於它是一個動畫,你可能需要在另一個線程上啓動連接,以便UI線程不被阻塞。如果它是靜止圖像,您可以調用picturebox的Update()方法來顯示它。但是,對於你的情況,這樣的事情應該工作:

Thread thread = new Thread(new ThreadStart(delegate 
{ 
    Invoke((Action)(()=>{ button_login.Text = WORKING; Loading(ShowMode.show, pictureBox_login_loading); })); 
    // send request   
    client = new TcpClient(); 
    try 
    { 
     IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000); 
     client.Connect(endPoint); 
     // send login details .. :) 
     output = client.GetStream(); 
     writer = new BinaryWriter(output); 
     reader = new BinaryReader(output); 
     // write details 
     writer.Write("login" "|" userID "|" privateName); 
    } 
    catch (Exception) 
    { 
     MessageBox.Show("Server is down."); 
     return; 

    } 
    finally 
    { 
     // Stop loading and return status 
     Invoke((Action)(()=>{ button_login.Text = DEFAULT_LOGIN_TEXT; Loading(ShowMode.hide, pictureBox_login_loading); })); 
     } 
})); 
thread.Start(); 

你也可以使用像討論的其他答案一個BackgroundWorker,但我傾向於保留更長久運行的任務,比如那些帶有進度報告進度酒吧。如果是短期(ish)任務,我通常在.NET 4.0中使用ThreadTask.Factory.StartNew

相關問題