如何在c#中跳出无限循环

本文关键字:无限循环 | 更新日期: 2023-09-27 18:18:59

所以我有一个2表单的应用程序。在第一个表单中,您输入当天的报价,然后按下按钮,打开第二个表单,并在标签中显示文本。然后你按下一个按钮,文本就会无限循环地在屏幕上滚动。它显然会挂起程序。我希望能够有文本坐在那里滚动,直到有人想要停止它与一个按钮点击或什么的…我很确定你必须用线程来做,我只是一个新手,对线程了解不多……这里是我的无限循环,我调用click…

private void StartScroll()
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder(label2.Text + " ");
        while (true)
        {
            char ch = sb[0];
            sb.Remove(0, 1);
            sb.Insert( sb.Length , ch);
            label2.Text = sb.ToString();
            label2.Refresh();
            System.Threading.Thread.Sleep(100);

        }
    }

任何帮助都是感激的!

如何在c#中跳出无限循环

看看这个网站的后台worker。这真的很容易实现,应该能够解决你的问题。

http://www.dotnetperls.com/backgroundworker

只需创建一个每100毫秒滴答一次的计时器。例子:

//Create a new timer that ticks every 100ms
var t = new System.Timers.Timer (100);
//When a tick is elapsed
t.Elapsed+=(object sender, System.Timers.ElapsedEventArgs e) => 
{
   //what ever you want to do
};
//Start the timer
t.Start();

如果你需要你的文本滚动通过表单(如果我理解正确的话),你可以试试这个。TextSize是文本的大小,x代表表单的x轴,如果你需要,你可以改变这个。

System.Text.StringBuilder sb;
private int x,TextSize;
public Form1()
{
     InitializeComponent();
     sb = new System.Text.StringBuilder(label2.Text + " ");
     x = this.ClientRectangle.Width;
     TextSize = 16;
}
private void Button1_Click(object sender, EventArgs e)
{
    timer1.Tag = sb.ToString();
    timer1.Enabled = true;
}
void timer1_Tick(object sender, EventArgs e)
{
    Form1_Paint(this,null);
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
     string str = timer1.Tag.ToString();
     Graphics g = Graphics.FromHwnd(this.Handle);
     g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
     g.FillRectangle(Brushes.Black, this.ClientRectangle);
     g.DrawString(str, new Font("Arial", TextSize), new SolidBrush(Color.White), x, 5);
     x -= 5;
     if (x <= str.Length * TextSize * -1)
         x = this.ClientRectangle.Width;
    }

和停止定时器

    private void Button2_Click(object sender, EventArgs e)
    {
        timer1.Enabled = false;
    }