Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么{}while()循环不';t在按钮体中工作\u Click()方法_C#_Winforms - Fatal编程技术网

C# 为什么{}while()循环不';t在按钮体中工作\u Click()方法

C# 为什么{}while()循环不';t在按钮体中工作\u Click()方法,c#,winforms,C#,Winforms,此代码在控制台应用程序中正常工作,但在windows窗体应用程序中使用时,它无法正常工作。它从不停止,也不产生任何输出 我在控制台应用程序中使用它,如下所示: static void Main(string[] args) { Console.WriteLine("Enter your boolean query"); do{ string query = Console.ReadLine(); List<

此代码在控制台应用程序中正常工作,但在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窗体或WPF中,UI仅由单个线程管理。因此,如果UI从其线程调用的代码中有一个无休止的循环,它将永远阻塞,无法继续更新UI。这就是为什么您不会看到任何对话框出现的原因


相反,您应该在自己的线程中运行类似于此的代码,或者在BackgroundWorker对象的构造中更容易运行(然后使用DoWork和ProgressChanged事件)。

在Windows窗体或WPF中,UI仅由单个线程管理。因此,如果UI从其线程调用的代码中有一个无休止的循环,它将永远阻塞,无法继续更新UI。这就是为什么您不会看到任何对话框出现的原因


相反,您应该在自己的线程中运行类似于此的代码,或者在BackgroundWorker对象的构造中更容易运行(然后使用DoWork和ProgressChanged事件)。

在您的控制台示例中,
Consol.ReadLine()
调用阻塞UI并等待输入。通过使用无限while循环,您可以有效地允许用户输入任意数量的查询。然而,在基于Forms/WPF的应用程序中,无限循环实际上是一个糟糕的想法,而且应用程序将一直保持到关闭,而不是在完成工作后立即关闭(这就是为什么在控制台应用程序中使用无限循环)


这是因为基于表单的应用程序利用专用线程来更新UI。通过阻止此线程,您还可以防止任何其他UI更新的发生,从而冻结您的应用程序。根据您尝试执行的操作,
按钮6\u Click
事件方法应将此工作卸载给BackgroundWorker(),该方法允许在另一个线程上执行工作,然后将更新打包到UI线程上。

在您的控制台示例中,
Consol.ReadLine()
调用会阻塞UI并等待输入。通过使用无限while循环,您可以有效地允许用户输入任意数量的查询。然而,在基于Forms/WPF的应用程序中,无限循环实际上是一个糟糕的想法,而且应用程序将一直保持到关闭,而不是在完成工作后立即关闭(这就是为什么在控制台应用程序中使用无限循环)


这是因为基于表单的应用程序利用专用线程来更新UI。通过阻止此线程,您还可以防止任何其他UI更新的发生,从而冻结您的应用程序。根据您尝试执行的操作,
button6\u-Click
事件方法应该将此工作卸载给BackgroundWorker(),这样可以在另一个线程上执行工作,然后将更新封送到UI线程上。

我相信从button\u-Click事件处理程序中删除do-while循环将为您完成这项工作

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

    }
当它得到输入时,它进行必要的计算,打印要打印的内容,并再次在同一行等待下一个输入

winform应用程序不是这样工作的,它已经有了一个处理UI活动(按键等)的事件循环


简而言之,处理程序方法中不需要循环。

我相信从按钮单击事件处理程序中删除do while循环将为您完成这项工作

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

    }
当它得到输入时,它进行必要的计算,打印要打印的内容,并再次在同一行等待下一个输入

winform应用程序不是这样工作的,它已经有了一个处理UI活动(按键等)的事件循环


简而言之,在handler方法中不需要循环。

我很清楚;在控制台应用程序中,循环中有一个console.ReadLine,它使循环停止,直到用户输入一个值并点击Return。在表单应用程序中,不需要执行while循环。用户在文本框4中输入一个值,然后单击按钮处理请求。

我很清楚;在控制台应用程序中,循环中有一个console.ReadLine,它使循环停止,直到用户输入一个值并点击Return。在表单应用程序中,不需要执行while循环。用户在文本框4中输入值,然后单击按钮处理请求。

在控制台应用程序中,
Main
是应用程序的入口点。所有程序都有此功能,当您启动可执行文件时,操作系统会调用此功能

一旦被调用,它将像任何其他函数一样执行(从上到下),如果
Main
返回一个值,它将返回给操作系统,操作系统将终止程序

为了防止程序在一次运行后退出,通常的做法是使用
while
循环,以确保未达到
main
函数的末尾(并执行
return

Console.ReadLine
是一个阻塞功能-这意味着它不会让下一行代码执行,直到它完成它所做的任何事情(在这种情况下,读取用户的输入)

因此,控制台应用程序逐行运行,直到获得输入。然后对其求值,输出一个字符串并永远重复

现在,在WinForms应用程序中,事情的管理略有不同。UI(按钮、表单、文本框等)由主线程处理,这意味着您需要给它时间进行更新。通过在您的按钮点击功能中有一个无休止的循环,您永远不会将控制权返回到主线程,UI将被锁定

如果只想让函数运行多次,请删除
while
循环
string query = Console.ReadLine();
: listBox1.Items.Add("No Search Result Found"); } label1.Text = "Search = " + listBox1.Items.Count + " items, " + DateTime.Now.Subtract(dt).TotalSeconds + " s"; Application.DoEvents(); // add that line } 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; List 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"; }