0

このコードはコンソール アプリケーションでは正しく動作しますが、Windows フォーム アプリケーションで使用すると正しく動作しません。停止することはなく、出力も生成されません。

私はこのようなコンソールアプリケーションでそれを使用し、それは動作します:

 static void Main(string[] args)
    {
     Console.WriteLine("Enter your boolean query");
        do{
            string query = Console.ReadLine();
            List<int> lst = ProcessQuery(query);
            count = 0;
            if (lst!=null)
            {
                foreach (int a in lst)
                {
                    if (a == 1)
                    {
                        Console.WriteLine(documentContentList[count]);
                    }
                    count++;
                }
            }
            else
            {
                Console.WriteLine("No search result found");
            }

        }  while(1==1);

    }

Windows フォーム アプリケーションのメソッドで上記のコードを使用しようとしましたbutton_clickが、機能しません。何か問題があると思いますwhile(1==1)- 同等のものはありますか?

ボタン用に書いたメソッドは次のとおりです。

 private void button6_Click(object sender, EventArgs e)
    {
        if (t == null)
        {
            MessageBox.Show("Click on LoadFile Button,Please.");
            return;
        }
        if (textBox4.Text == "")
        {
            MessageBox.Show("Enter your Boolean Query");
            return;
        }
        listBox1.Items.Clear();
        DateTime dt = DateTime.Now;
        do{
            List<int> lst = t.ProcessQuery(textBox4.Text);
            count = 0;
            if (lst != null)
            {
                foreach (int a in lst)
                {
                    listBox1.Items.Add(t.documentContentList[count]);
                }
                count++;
            }
            else
            {
                listBox1.Items.Add("No Search Result Found");
            }
            label1.Text = "Search = " + listBox1.Items.Count + " items, " + DateTime.Now.Subtract(dt).TotalSeconds + " s";
        } while (1==1);

    }
4

6 に答える 6

0

コンソール アプリケーションでMainは、アプリケーションのエントリ ポイントです。すべてのプログラムにはこの関数があり、実行可能ファイルを起動するとオペレーティング システムによって呼び出されます。

呼び出されると、他の関数と同じように (上から下に) 実行されMain、値を返す場合は OS に戻り、OS はプログラムを終了します。

1 回の実行後にプログラムが終了しないようにするために、whileループを使用して、main関数の最後に達していないこと (およびreturn実行されていないこと) を確認するのが一般的な方法です。

Console.ReadLineブロッキング関数です。これは、実行する処理が完了するまで次のコード行を実行できないことを意味します (この場合、ユーザーからの入力を読み取ります)。

したがって、コンソール アプリケーションは、入力を受け取るまで 1 行ずつ実行されます。次に、これを評価し、文字列を出力して、永遠に繰り返します。

現在、WinForms アプリケーションでは、管理方法が少し異なります。UI (ボタン、フォーム、テキスト ボックスなど) はメイン スレッドによって処理されます。つまり、更新する時間を与える必要があります。ボタン クリック関数内に無限ループがあると、制御がメイン スレッドに返されず、UI がロックされます。

関数を複数回実行するだけの場合は、whileループを削除すると、ボタンがクリックされるたびにコードが実行されます。Winforms がそれを処理します。

それでも UI がロックされる場合は、コードがブロックしている時間が長すぎます (ボタン イベント内)。

その場合、集中的な作業を非同期で (少しずつ) 行うか、作業を別のスレッドにオフロードする必要があります。UI がフリーズしないようにbackgroundWorkersの使用を検討し、無限ループを削除してください。

于 2013-05-09T14:57:59.203 に答える
0

In your Console example, the Consol.ReadLine() call blocks the UI & waits for input. By using the infinite while loop, you effectively allow users to enter as many queries as they want. However, in a Forms/WPF based application an infinite loop is actually a terrible idea, plus the application will stay up until closed, rather than closing immediately upon completion of your work (which is why you use the infinite loop in a Console application).

This is because Forms based applications leverage a dedicated thread to update the UI. By blocking this thread you also prevent any other UI updates from occurring, freezing up your application. Based on what you're trying to do, the button6_Click event method should offload this work to a BackgroundWorker (documentation), which allows work to be performed on another thread then marshalled updates onto the UI thread.

于 2013-05-09T14:45:39.713 に答える
0

Windows フォームまたは WPF では、UI は単一のスレッドによってのみ管理されます。そのため、UI がそのスレッドから呼び出しているコード内に無限ループがある場合、コードは永久にブロックされ、UI の更新を続行できなくなります。これが、ダイアログ ボックスが表示されない理由です。

代わりに、このコードのようなものを独自の Thread で実行するか、BackgroundWorker オブジェクトの構成内で (さらに DoWork および ProgressChanged イベントを使用して) より簡単に実行する必要があります。

于 2013-05-09T14:40:56.827 に答える
0

私には明らかです。コンソール アプリケーションでは、ループ内に Console.ReadLine があり、ユーザーが値を入力して Return キーを押すまで停止します。フォーム アプリケーションでは、do while ループは必要ありません。ユーザーは textBox4 に値を入力し、ボタンをクリックしてリクエストを処理します。

于 2013-05-09T14:56:40.013 に答える