使用Windows窗体的C#实时计数器
如何在我的使用Windows窗体的C#实时计数器,c#,.net,winforms,C#,.net,Winforms,如何在我的Windows窗体中对读取了多行的计数行执行计数器操作 当我执行我的Windows窗体时这个计数器就在应用程序处理每个数据时显示 示例代码 public Form1() { InitializeComponent(); setMessage(string.Empty, this.lblErro); } private void button1_Click(object sender, EventArgs e) {
Windows窗体中对读取了多行的计数行执行计数器操作
当我执行我的Windows窗体时
这个计数器就在应用程序处理每个数据时显示
示例代码
public Form1()
{
InitializeComponent();
setMessage(string.Empty, this.lblErro);
}
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i <= xmlnode.Count - 1; i++)
{
int cont = i;
ThreadPool.QueueUserWorkItem(_ =>
{
setMessage(++cont + " of " + xmlnode.Count, this.lblCounter);
});
}
void setMessage(string message, Label lbl)
{
if (InvokeRequired)
{
Invoke((MethodInvoker)(() => setMessage(message, lbl)));
}
else
{
lbl.Text = message;
}
}
}
public Form1()
{
初始化组件();
setMessage(string.Empty,this.lblErro);
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
对于(int i=0;i
{
setMessage(++cont+“+xmlnode.Count,this.lblCounter的“+cont+”);
});
}
void setMessage(字符串消息,标签lbl)
{
如果(需要调用)
{
调用((MethodInvoker)(()=>setMessage(message,lbl));
}
其他的
{
文本=消息;
}
}
}
我试过上面的代码,但没有成功。当应用程序处理所有数据时仍显示消息尝试将循环放入:
ThreadPool.QueueUserWorkItem(_ => {
for (int i = 0; i <= xmlnode.Count - 1; i++)
{
int cont = i;
setMessage(++cont + " of " + xmlnode.Count, this.lblCounter);
}
});
ThreadPool.QueueUserWorkItem(=>{
对于(int i=0;i您需要运行此循环:
for (int i = 0; i <= xmlnode.Count - 1; i++)
{
...
}
然后在选择器中
:
_worker.DoWork += (s, e) =>
{
// place the entire for loop in here
}
现在,当您准备运行它时,只需执行以下操作:
_worker.RunWorkerAsync();
你需要在UI线程外运行循环。代码肯定是错误的。没关系,不到一眨眼就结束了。@HansPassant这只是一个示例,在我的循环中,我有很多验证,我的数据库中有很多研究,我把它们放在这里以便于理解。将来,至少发表一条评论或一篇文章假线程在你的代码片段中,很明显延迟发生在哪里。工作很好,就像@stenprov的另一个答案。就像你说的,有很多方法可以实现这一点,但是你能告诉我为什么你更喜欢BackgroundWorker
?@Lucas_Santos,BackgroundWorker
非常健壮,因为它支持切换thr的进度报告eads以及取消。它在早期的框架中也可用,而不是async
/wait
模式。
_worker.RunWorkerAsync();