使用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();