C# 为什么{}while()循环不';t在按钮体中工作\u Click()方法
此代码在控制台应用程序中正常工作,但在windows窗体应用程序中使用时,它无法正常工作。它从不停止,也不产生任何输出 我在控制台应用程序中使用它,如下所示: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<
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";
}