Hello,
因为您把Thread.Sleep放到Invoke区段里,把它搬出来就可以了
th = new Thread(() =>
{
try
{
long count = 0;
while (true)
{
this.Invoke((Action)(() =>
{
this.listView1.Items.Add(count++.ToString());
}));
Thread.Sleep(2000);
}
}
catch (ThreadAbortException ex)
{
throw;
}
}) { IsBackground = true };
th.Start();
另外,您没有离开循环,不建议用 Abort 中止线程,您可使用其标判定是否要离开循环;也不建议使用Thread Class,建议使用Task,您可参考以下代码
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this._synchronizationContext = SynchronizationContext.Current;
}
private SynchronizationContext _synchronizationContext;
private Thread th;
private volatile bool IsRunning = false;
private void button1_Click(object sender, EventArgs e)
{
Start();
}
private void Start()
{
if (this.IsRunning)
{
return;
}
this.IsRunning = true;
Task.Factory.StartNew(() =>
{
long count = 0;
while (this.IsRunning)
{
this._synchronizationContext.Post(_ =>
{
this.listView1.Items.Add(count++.ToString());
}, null);
SpinWait.SpinUntil(() => !this.IsRunning, 1);
}
});
}
private void Stop()
{
this.IsRunning = false;
}
private void button2_Click(object sender, EventArgs e)
{
Stop();
}
}
更多的Task class用法,请参考
秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/