如何在文本框中每隔一秒随机生成整数值,直到我点击按钮。
我提出了以下代码(单击按钮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)
{
}
}
}
答案 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++;
}
}
如果您真的想每秒添加一个新号码,可以使用async
和await
(停止阻止用户界面)并添加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);
}
}