如何在C#中的文本框中生成随机整数

时间:2016-02-27 00:45:24

标签: c# visual-studio

如何在文本框中每隔一秒随机生成整数值,直到我点击按钮。

我提出了以下代码(单击按钮1应该在textBox1中每1秒生成一次随机整数,直到单击Button2)并且它不起作用(输出为空文本框)。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Timers;

namespace WindowsFormsApplication5
{
    public partial class Form1 : Form
    {
        bool buttonclicked = false;
        System.Timers.Timer myTimer;
        System.Random r = new System.Random();
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            while (buttonclicked == false)
            {
                myTimer = new System.Timers.Timer();
                myTimer.Elapsed += new ElapsedEventHandler(rnd);
                myTimer.Interval = 1000;
                myTimer.Start();
            }
        }
        public void rnd(Object sender, EventArgs e)
        {
            textBox1.Text = r.Next(0, 1000).ToString();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            buttonclicked = true;
            myTimer.Stop();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }
    }
}

3 个答案:

答案 0 :(得分:-1)

看起来是因为你使用的是while循环而不是if块。你的情况应该是这样的:

if( buttonclicked == false)
{
    ....
}

答案 1 :(得分:-1)

一旦你点击按钮,你的while(buttonclicked == false)将创建一个无限循环。你可以这样做

    private void button1_Click_1(object sender, EventArgs e)
    {
            myTimer = new System.Timers.Timer();
            myTimer.Elapsed += new System.Timers.ElapsedEventHandler(rnd);
            myTimer.Interval = 1000;
            myTimer.Start();
    }

    private void button2_Click_1(object sender, EventArgs e)
    {
        myTimer.Stop();
    }

你需要通过以下方式对文本框进行安全的线程调用:

    delegate void SetTextCallback(string text);
    private void SetText(string text)
    {
        if (this.textBox1.InvokeRequired)
        {
            SetTextCallback d = new SetTextCallback(SetText);
            this.Invoke(d, new object[] { text });
        }
        else
        {
            this.textBox1.Text = text;
        }
    }

设置文本只需使用SetText(r.Next(0,1000).ToString());

答案 2 :(得分:-1)

我认为你是一个循环的权利 - 但不是计时器。

除非您在其他地方使用它,否则无需在班级声明System.Random

使用for循环。

private void button1_Click_1(object sender, EventArgs e)
{
    var r = new System.Random();

    for (var i = 0; i < 1000; i++)
    {
        textBox1.Text = r.Next(0, 1000).ToString();
    }
}

使用while循环。

private void button1_Click_1(object sender, EventArgs e)
{
    var r = new System.Random();
    var i = 0;

    while (i < 1000)
    {
        textBox1.Text = r.Next(0, 1000).ToString();
        i++;
    }
}

如果您真的想每秒添加一个新号码,可以使用asyncawait(停止阻止用户界面)并添加System.Threading.Thread.Sleep(1000);

基于Task甚至基于Timer(在我看来)。了解任务如何工作是很好的。

Timer对于这种情况是可以的 - 但在实际应用中,它们可能会变得混乱,特别是对于多个计时器。

以下是使用Tasks进行上述操作的示例。

private void button1_Click(object sender, EventArgs e)
{
    var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();

    Task.Factory.StartNew(() => AddRandomNumbers(uiScheduler));
}

private async Task AddRandomNumbers(TaskScheduler uiScheduler)
{
    var r = new Random();

    for (int i = 0; i < 1000; i++)
    {
        await Task.Factory.StartNew(
            () => textBox1.Text = r.Next(0, 1000).ToString(), 
            CancellationToken.None, 
            TaskCreationOptions.None,
            uiScheduler);

            Thread.Sleep(1000);
    }
}