Jak wyświetlać progres bar podczas deserializacji tabeli z pliku i wypełniania tabeli datagridview?

Edit: Znalazłem stronę http://msdn.microsoft.com/en-us/magazine/cc163515.aspx

 public abstract class ContainerStream : Stream
    {
        private Stream _stream;

        protected ContainerStream(Stream stream)
        {
            if (stream == null) throw new ArgumentNullException("stream");
            _stream = stream;
        }

        protected Stream ContainedStream { get { return _stream; } }

        public override bool CanRead { get { return _stream.CanRead; } }

        public override bool CanSeek { get { return _stream.CanSeek; } }

        public override bool CanWrite { get { return _stream.CanWrite; } }

        public override void Flush() { _stream.Flush(); }

        public override long Length { get { return _stream.Length; } }

        public override long Position
        {
           get { return _stream.Position; }
           set { _stream.Position = value; }
        }

        public override int Read(byte[] buffer, int offset, int count)
        {
            return _stream.Read(buffer, offset, count);
        }
    
    }

    public class ReadProgressStream : ContainerStream
    {
        private int _lastProgress = 0;

        public ReadProgressStream(Stream stream)
            : base(stream)
        {
            if (!stream.CanRead || !stream.CanSeek || stream.Length <= 0)
                throw new ArgumentException("stream");
        }

        public override int Read(byte[] buffer, int offset, int count)
        {
            int amountRead = base.Read(buffer, offset, count);
            if (ProgressChanged != null)
            {
                int newProgress = (int)(Position * 100.0 / Length);
                if (newProgress > _lastProgress)
                {
                    _lastProgress = newProgress;
                    ProgressChanged(this,
                        new ProgressChangedEventArgs(_lastProgress, null));
                }
            }
            return amountRead;
        }

        public event ProgressChangedEventHandler ProgressChanged;

        public override long Seek(long offset, SeekOrigin origin)
        {
            throw new NotImplementedException();
        }

        public override void SetLength(long value)
        {
            throw new NotImplementedException();
        }

        public override void Write(byte[] buffer, int offset, int count)
        {
            throw new NotImplementedException();
        }
    }

public static T Deserialize<T>(
Stream stream, ProgressChangedEventHandler callback)
{
  using (ReadProgressStream rps = new ReadProgressStream(stream))
  {
    rps.ProgressChanged += callback;
    BinaryFormatter formatter = new BinaryFormatter();
    return (T)formatter.Deserialize(rps);
  }
} 

 public void setprogressbar1(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }                

użycie:

 
 dt = Deserialize<DataTable>(myStream, new ProgressChangedEventHandler(setprogressbar1));   

Dlaczego pasek ładuje się dużo wczesniej przed czasem załadowania pliku?

Edit 2: Pozostał jeszcze problem jak wyświetlać progressbar dla wczytywania tabeli.
Tabelę wczytuję tak:

dataGridView1.DataSource = dt.DefaultView;
myBindingSource.DataSource = dt;

Czy myBinding ma jakiegoś eventa który może do tego posłużyć?