2012-12-18 43 views
0

我編寫了一個簡單的類來生成數組,因爲我需要一些硬編碼的隨機數組用於我自己的調試目的,但是儘管在單獨的工作線程中調用了及時的操作,但我的UI仍然掛起!下面的代碼...線程代碼導致用戶界面掛起

private static Random randGenerator = new Random(); 

    private void generateButton_Click(object sender, EventArgs e) 
    { 
     string dataType = "System."; 
     if (typeComboBox.Text != "Byte") 
      dataType += signedCheckBox.Checked ? "" : "U"; 
     else if (typeComboBox.Text == "Byte") 
      dataType += signedCheckBox.Checked ? "S" : ""; 
     dataType += typeComboBox.Text; 

     generateButton.Enabled = false; 

     new Thread(() => 
      { 
       Process(Type.GetType(dataType), (int)sizeNumericUpDown.Value, hexCheckBox.Checked); 
      }).Start(); 
    } 

    private void Process(Type type, int size, bool hex) 
    { 
     StringBuilder sBuilder = new StringBuilder(); 
     sBuilder.Append(string.Format(@"{0}[] values = new {0}[{1}] {{", type.Name, size)); 

     for (int i = 0; i < size; i++) 
     { 
      int random = randGenerator.Next(0, GetIntegralMaxValue(type)); 
      sBuilder.Append((hex ? "0x" + random.ToString("x2") : random.ToString()) + (i < size - 1 ? ", " : " };")); 
     } 

     outputTextBox.BeginInvoke((MethodInvoker)delegate 
     { 
      outputTextBox.Text = sBuilder.ToString(); 
     }); 
    } 

    private int GetIntegralMaxValue(Type type) 
    { 
     var field = type.GetField("MaxValue").GetValue(null); 
     return Convert.ToInt32(field); 
    } 

我想,也許這個問題,試圖訪問主線程上創建所以不是我把它們傳遞給方法的對象撒謊。我也嘗試在類中聲明我的randGenerator對象,但仍然沒有運氣。有誰可以找出問題嗎?

+0

它無限期懸掛?其他的東西是否在後臺運行並嘗試訪問UI線程? –

+0

不僅在操作完成之前。這是我班上唯一的代碼。 –

+3

我們在談論多少數據?如果數量巨大,可能需要很長時間才能更新。一個想法,不過,你可能會在調用之前調用'sBuilder.ToString()':var s = sBuilder.ToString(); ... outputTextBox.Text = s; –

回答

1

TextBox不是用來保存大量數據 - 當數據量增加時,它變得非常慢。我會說填充StringBuilder需要大約5%的時間,而將這些數據分配給TextBox(在UI線程中執行)需要95%的時間。你可以輕鬆地檢查這一點。只需在調試模式下運行此代碼並在掛起時單擊「暫停」按鈕。它應該打破「outputTextBox.Text = sBuilder.ToString();」線。