这是我的代码:
private void _1_Load(object sender, EventArgs e)
{
FillA();
FillB();
// Tried these lines too but they show listbox values but not textbox value
// var t2 = Task.Run(() => FillA());
// FillB();
}
private void FillA()
{
this.Invoke(new MethodInvoker(delegate()
{
for (int i = 1; i > 0; i++)
{
listBox1.Items.Add(i.ToString());
listBox1.Update();
Thread.Sleep(25);
}
}));
}
private void FillB()
{
Thread.Sleep(3000); //1 seconds delay
textBox1.Text = "Hello World!";
}
当页面加载时,listbox
应该开始显示数字1,2,3 ...然后在几秒钟的延迟后,文本框应该显示Hello World!
值,但列表框应该保持增长。如何确保首先列表框应该开始填充,然后文本框应该填充。我不想等待填充列表框,然后填写文本框。
任何建议都将受到赞赏。
修改 这只是一个示例代码。在实际生产中,将有两个进程,第二个进程将在第一个进程开始获取数据并存储在列表框中时启动。
第一个过程应继续进行。我无法在中间停止它,因为它会在数据中造成不一致。
答案 0 :(得分:1)
不要使用睡眠。而是使用Timer-class:
https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx
配置超时1秒。
连接计时器的Elapsed事件:
aTimer.Elapsed += OnTimedEvent;
在方法OnTimedEvent中,您可以增加整数变量 i 。
根据 i 的值,您填写第一个列表框,如果值更高,请填写另一个列表框。
答案 1 :(得分:0)
您无法一次性将所有项目添加到列表框中并更新文本框,因为这些操作在WindowsForms中同步完成。
相反,您应该只将一部分项目添加到列表框中,更新文本框,然后继续将项目添加到列表框中。
要在等待操作之间不冻结GUI,您可以使用async\await
组合而不是Thread.Sleep()
。
private async void _1_Load(object sender, EventArgs e)
{
await AddInitialListBoxItems();
await FillTextBox();
await AddRemainingListBoxItems();
}
private async Task AddInitialListBoxItems()
{
for (int i = 1; i < 10; i++)
{
listBox1.Items.Add(i.ToString());
listBox1.Update();
await Task.Delay(25);
}
}
private async Task FillTextBox()
{
await Task.Delay(3000); //1 seconds delay
textBox1.Text = "Hello World!";
}
private async Task AddRemainingListBoxItems()
{
for (int i = 11; i < 100; i++)
{
listBox1.Items.Add(i.ToString());
listBox1.Update();
await Task.Delay(25);
}
}
答案 2 :(得分:0)
如果您可以使用Timer
而不是直接线程,这可能会对您有所帮助。它在我的电脑上运行:
编辑,因为您需要在延迟一段时间后写入文本框,您还需要使用计时器。我编辑了下面的代码。文本框是在列表框填充开始1秒后写入的。
public partial class Form1 : Form
{
int counter = 0;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
timer.Interval = 25;
timer.Tick += Timer_Tick;
timer.Start();
System.Windows.Forms.Timer timerTextbox = new System.Windows.Forms.Timer();
timerTextbox.Interval = 1000;
timerTextbox.Tick += TimerTextbox_Tick; ;
timerTextbox.Start();
}
private void TimerTextbox_Tick(object sender, EventArgs e)
{
FillB();
(sender as System.Windows.Forms.Timer).Stop();
}
private void Timer_Tick(object sender, EventArgs e)
{
listBox1.Items.Add(counter.ToString());
counter++;
listBox1.Update();
}
private void FillB()
{
textBox1.Text = "Hello World!";
}
}
当然,当您在Thread.Sleep(3000); //1 seconds delay
事件(3000毫秒是3秒btw)上致电Load
时,您的表单会在3秒后显示。