线程代码导致UI挂起

时间:2012-12-18 20:33:01

标签: c# multithreading user-interface

我编写了一个简单的类来生成数组,因为我需要一些硬编码的随机数组用于我自己的调试目的,但是尽管在一个单独的工作线程中调用了及时的操作,我的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对象,但仍然没有运气。有人可以找出问题吗?

1 个答案:

答案 0 :(得分:1)

TextBox不是为容纳大量数据而设计的 - 当数据量增加时,它变得非常慢。我想说,StringBuilder的填充大约需要5%的时间,而将这些数据分配给TextBox(在UI线程中执行)需要剩余95%的时间。你可以轻松检查这个。只需在调试模式下运行此代码,然后在挂起期间单击“暂停”按钮。它应该打破“outputTextBox.Text = sBuilder.ToString();”线。