可以运行无限循环,但不能阻止程序或表单吗?
例如,我有一个无限循环
private void infLoop()
{
while(1<3)
{
textBox1.Text+="1";
textBox1.Refresh();
}
}
然后在按钮上我打电话。
private void button1_Click(object sender, EventArgs e)
{
infLoop();
}
这个wold块形式,我无法关闭它,移动它等等。
我是否有某种方式可以向后运行这样的东西,而不是阻止形式?
感谢名单
答案 0 :(得分:2)
实现这一目标的最简单方法是使用async await。但是这会跑得太快,会杀死你的电脑。
private async void infLoop()
{
while(1<3)
{
await Task.Yield();
textBox1.Text+="1";
textBox1.Refresh();
}
}
你更可能想要的是......
private async void infLoop()
{
int i = 1;
while(true)
{
await Task.Delay(TimeSpan.FromSeconds(1));
textBox1.Text = i.ToString();
textBox1.Refresh();
i += 1;
}
}
答案 1 :(得分:1)
基于msdna,试试这个解决方案:也许你必须根据自己的需要进行调整。
此解决方案使用新的Thread设置文本框和回调,以避免在尝试使用运行表单本身的相同线程修改表单时引发“跨线程InvalidOperationException”。
private void Form1_Load(object sender, EventArgs e)
{
System.Threading.Thread newThread = new System.Threading.Thread(new System.Threading.ThreadStart(this.ThreadProcSafe));
newThread.Start();
}
private void ThreadProcSafe()
{
this.SetText();
}
private void SetText()
{
if (textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d);
}
else
{
while (1 < 3)
{
textBox1.Text += "1";
textBox1.Refresh();
}
}
}
答案 2 :(得分:0)
在 DoWorkEvent (自动生成)中添加无限循环在此处添加此代码 LoadFunction
if (backgroundWorker1.IsBusy == false)
{
backgroundWorker1.RunWorkerAsync();
}
Backworkworker是一个在后台运行以执行繁重任务的线程,它可以同时运行GUI,而不会冻结。无论你使用系统调用等,
答案 3 :(得分:-1)
你在谈论winforms? 见BackgroundWorker