1

新しいスレッドを使用して Windows フォームをロードすると、毎秒リストボックスに乱数が追加され、10 個の数字に達すると、10 個の乱数の新しいセットが生成されます。ただし、現時点では、UI スレッドに問題があります。乱数がリストボックスに追加されていますが、フォームを制御できません。フォームを操作しようとすると、UI がフリーズします。MethodInvoker を間違って使用していますか? アドバイスをいただければ幸いです。

public Form1()
    {
        InitializeComponent();
        Thread ranThread = new Thread(new ThreadStart(RandomList));
        ranThread.IsBackground = true;
        ranThread.Start();         
    }

public void RandomList()
    {
        stack = new Stack<int>(); 
        while (loop)
        {
            if (lbxStackRndNum.InvokeRequired)
            {
                lbxStackRndNum.Invoke(new MethodInvoker(delegate
                    {
                        Random rnd = new Random();

                        if (lbxStackRndNum.Items.Count == 10)
                        {
                            stack.Clear();
                            lbxStackRndNum.Items.Clear();
                        }

                        int rndVal = rnd.Next(1, 10000);
                        stack.Push(rndVal);
                        lbxStackRndNum.Items.Insert(0, rndVal);
                        Thread.Sleep(1000);
                    }));
            }
        }
    }
4

2 に答える 2

5

Thread.Sleep(1000)呼び出されたデリゲート内で呼び出しています。つまり、UI スレッドはスリープ状態になり、 ranThread.

public void RandomList()
{
    stack = new Stack<int>(); 
    while (loop)
    {
        if (lbxStackRndNum.InvokeRequired)
        {
            lbxStackRndNum.Invoke(new MethodInvoker(delegate
                {
                    Random rnd = new Random();

                    if (lbxStackRndNum.Items.Count == 10)
                    {
                        stack.Clear();
                        lbxStackRndNum.Items.Clear();
                    }

                    int rndVal = rnd.Next(1, 10000);
                    stack.Push(rndVal);
                    lbxStackRndNum.Items.Insert(0, rndVal);
                }));
              Thread.Sleep(1000);
        }
    }
}
于 2013-04-28T17:28:05.700 に答える
1

実際の作業は Invoke() とデリゲートを介してメイン UI スレッドで行われ、スレッドが実際に行っているのは Sleep() を介して 1 秒のタイマーとして機能することだけなので、通常のタイマーを追加してみませんか? () ツールボックスからフォームに移動し、間隔を 1000 に設定し、コードを Tick() イベントに配置しますか?

于 2013-04-28T21:21:32.773 に答える