C#进度条未填充

C#进度条未填充,c#,multithreading,events,progress-bar,eventhandler,C#,Multithreading,Events,Progress Bar,Eventhandler,我正在开发一个应用程序,它使用progressbar向用户显示程序中的任何开发。我正在编写的程序使用progressbar向用户显示在执行过程中发送了多少数据包。我在底层库中创建了一个事件,一旦传输了另一个数据包,该事件就会触发。以下是我设置的事件行: public delegate void ChangedEventHandler(object sender, EventArgs e); public event ChangedEventHandler PercentageUpdate; p

我正在开发一个应用程序,它使用progressbar向用户显示程序中的任何开发。我正在编写的程序使用progressbar向用户显示在执行过程中发送了多少数据包。我在底层库中创建了一个事件,一旦传输了另一个数据包,该事件就会触发。以下是我设置的事件行:

public delegate void ChangedEventHandler(object sender, EventArgs e);
public event ChangedEventHandler PercentageUpdate;

protected internal virtual void OnPercentageChanged(EventArgs e)
{
        if (PercentageUpdate != null) PercentageUpdate(this, e);
}
请注意,上面的代码是在基础库中设置的。我已在此库中触发事件,如下所示:

//reinitializing is extraneous, as Receive() calls are overwriting
try
{
    fsa.rnd = fsa.TransferSocket.Receive(fsa.File_Buffer, 0, FSArgs.BlockSize, SocketFlags.None);
}
catch (Exception e)
{
    fsa.Dispose();
    throw new GeneralNetworkingException("FileSocket receive() failed!", e);
}

fsa.tot += Convert.ToInt64(fsa.rnd);
fsa.TransferPercentage = (fsa.tot/fsa.FileSize) * 100;
fsa.OnPercentageChanged(EventArgs.Empty);   //throw event for form
最后,在应用程序中,我将事件初始化为:

public delegate void UpdatePerc(int index);



f_list[f_list.Count-1].fsa.PercentageUpdate += (sender, e) => filesocket_percentage_updated(sender, e, sel_index);



private void filesocket_percentage_updated(object sender, EventArgs e, int index)
{   
        UpdateP(index);
}



private void UpdateP(int index)
{
    if (progressBar1.InvokeRequired)
    {
        this.BeginInvoke(new UpdatePerc(UpdateP), new object[] { index });
    }
    else
    {
        if (sel_index == index)     //then redraw progressbar
        {
            if (x_list[index] > 1)
            {
                y_list[index]++;
                if (((int)(y_list[index] % x_list[index])) == 0)
                {
                    z_list[index]++;
                    progressBar1.Increment(1);
                    progressBar1.Update();
                }
            }
            else
            {   
                z_list[index]++;
                progressBar1.Increment(1);
                progressBar1.Update();
                richTextBox1.Text += (z_list[index]+ '\n');
            }
        }
        else
        {
            if (x_list[index] > 1)
            {
                y_list[index]++;
                if (((int)(y_list[index] % x_list[index])) == 0)
                {
                    z_list[index]++;
                }
            }   
            else
            {
                z_list[index]++;
            }
        }
    }
}
如您所见,我正试图调用progressbar在并行线程上进行更新。然而,什么也没有发生。任何帮助都将不胜感激


谢谢。

请查看并改用“什么也没发生”-断点,伙计。您希望执行哪段代码但不执行?progressBar1.Increment(1);您的处理是在UI线程上完成的还是关闭的?我使用了Nathan所说的断点,并发现正在触发偶数,并且正在更新progressBar1.Value,但表单没有重新绘制。换句话说,progressBar1.Update没有做任何事情