创建无限循环而不阻塞表单

时间:2014-07-11 06:35:57

标签: c#

可以运行无限循环,但不能阻止程序或表单吗?

例如,我有一个无限循环

private void infLoop()
    {
      while(1<3)
      {
          textBox1.Text+="1";
          textBox1.Refresh();
      }
    }

然后在按钮上我打电话。

    private void button1_Click(object sender, EventArgs e)
    {
        infLoop();
    }

这个wold块形式,我无法关闭它,移动它等等。

我是否有某种方式可以向后运行这样的东西,而不是阻止形式?

感谢名单

4 个答案:

答案 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)

  1. 从工具箱中拖动backgroundworker控件。
  2. 双击它
  3. DoWorkEvent (自动生成)中添加无限循环在此处添加此代码 LoadFunction

        if (backgroundWorker1.IsBusy == false)
        {
            backgroundWorker1.RunWorkerAsync();
        }
    

    Backworkworker是一个在后台运行以执行繁重任务的线程,它可以同时运行GUI,而不会冻结。无论你使用系统调用等,

答案 3 :(得分:-1)

你在谈论winforms? 见BackgroundWorker