如何摆脱c#中的无限循环

时间:2013-06-17 22:47:37

标签: c# winforms infinite-loop

所以我有一个2表单应用程序。您在当天的报价中输入的第一个表单,然后按一个按钮打开第二个表单,并在标签中显示文本。然后按一个按钮,文本使用无限循环连续滚动屏幕。它显然挂起了程序。我希望能够让文本在那里滚动,直到有人想通过点击按钮或其他东西来阻止它...我很确定你必须用一个线程来做,我只是新的而且不要真的非常了解线程...... 这是我用按钮点击...

调用的无限循环
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);


        }
    }

感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

查看此站点的后台工作人员。它实施起来非常简单,应该能够解决您的问题。

http://www.dotnetperls.com/backgroundworker

答案 1 :(得分:1)

只需创建一个每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();

答案 2 :(得分:0)

如果您需要通过表单翻译文本(如果我理解正确的话),您可以尝试这个.TextSize是文本的大小,x表示表格的x轴,如果需要,可以更改。< / p>

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;
    }