C# 创建无阻塞形式的无限循环

C# 创建无阻塞形式的无限循环,c#,C#,可以运行无限循环,但不能用它阻塞程序或窗体 例如,我有一个无限循环 private void infLoop() { while(1<3) { textBox1.Text+="1"; textBox1.Refresh(); } } 这个世界块的形式,我不能关闭它,移动它,等等 有没有办法让我用倒转的方式来运行这样的东西,而不是用它来阻塞表单 Thanx你在说winforms? 请参见基于,尝试此解

可以运行无限循环,但不能用它阻塞程序或窗体

例如,我有一个无限循环

private void infLoop()
    {
      while(1<3)
      {
          textBox1.Text+="1";
          textBox1.Refresh();
      }
    }
这个世界块的形式,我不能关闭它,移动它,等等

有没有办法让我用倒转的方式来运行这样的东西,而不是用它来阻塞表单


Thanx

你在说winforms? 请参见

基于,尝试此解决方案:也许您必须根据自己的需要对其进行调整

此解决方案使用一个新线程来设置textbox,并使用回调来避免在尝试使用运行表单本身的同一线程修改表单时引发“跨线程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();
            }
        }
    }
private void Form1\u加载(对象发送方,事件参数e)
{
System.Threading.Thread newThread=new System.Threading.Thread(new System.Threading.ThreadStart(this.ThreadProcSafe));
newThread.Start();
}
私有void ThreadProcSafe()
{
这个.SetText();
}
私有void SetText()
{
if(textBox1.invokererequired)
{
SetTextCallback d=新的SetTextCallback(SetText);
本节引用(d);
}
其他的
{
而(1<3)
{
textBox1.Text+=“1”;
textBox1.Refresh();
}
}
}
  • 从工具箱中拖动backgroundworker控件
  • 双击它
  • 在DoWorkEvent中添加无限循环(自动生成)在 加载函数

        if (backgroundWorker1.IsBusy == false)
        {
            backgroundWorker1.RunWorkerAsync();
        }
    
    Backworkworker是一个线程,它在后台运行以完成繁重的任务,并同时运行GUI,而不会冻结。除非您使用系统调用等


  • 实现这一点的最简单方法是使用异步等待。然而,这将运行的方式太快,将杀死你的电脑

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

    在循环中使用计时器/线程/线程池/任务,并使用同步机制来更新UI。计时器或多线程可能是您正在搜索的。@运动请不要让他转向线程化…这将导致更多的问题。@Aron您可能是对的。他正在使用winforms,所以他可能需要调用很多组件。如果你说这是一种肮脏的方式。。。为什么还要建议它呢?最接近我在这里看到的工作的代码段…但是有点过头了…特别是在现代异步等待中。+1这种技术对于实现“后台无限循环”也很有用,就像后台线程通常使用的循环一样,它会永远循环并在可能的情况下执行任务。使用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;
        }
    }