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

メインスレッドで作成されたオブジェクトにアクセスしようとすることに問題があるのではないかと思ったので、代わりにそれらをメソッドに渡しました。また、クラス内でran​​dGeneratorオブジェクトを宣言しようとしましたが、それでもうまくいきませんでした。誰かが問題を特定できますか?

4

1 に答える 1

1

TextBoxは、大量のデータセットを保持するようには設計されていません。データ量が増えると、非常に遅くなります。StringBuilderの入力には約5%の時間がかかりますが、このデータをTextBox(UIスレッドで実行される)に割り当てるには残りの95%の時間がかかります。これは簡単に確認できます。このコードをデバッグモードで実行し、ハング中に[一時停止]ボタンをクリックするだけです。「outputTextBox.Text=sBuilder.ToString();」で中断する必要があります ライン。

于 2012-12-20T04:49:06.977 に答える