Как асинхронно сообщать о ходе создания Zip файла в строку состояния? - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь сообщить о прогрессе в моей строке состояния при создании zip-файла.

Для сообщения о ходе создания я использовал следующее руководство:
Отчет о создании ZipFile

Моя строка состояния в настоящее время обновляется с использованием 2 классов:

  • класс INotifyPropertyChanged с именем StatusBar
  • отдельный класс с именем Status.

Класс StatusBar:

public class StatusBar : INotifyPropertyChanged
{
    private string _message;
    private string _submessage;
    private bool _isindeterminate;
    private bool _visible;
    private int _min;
    private int _max;
    private double _progress;
    public event PropertyChangedEventHandler PropertyChanged;

    public StatusBar() { }

    public int Min
    {
        get { return this._min; }
        set
        {
            this._min = value;
            this.OnPropertyChanged("Min");
        }
    }
    public int Max
    {
        get { return this._max; }
        set
        {
            this._max = value;
            this.OnPropertyChanged("Max");
        }
    }
    public double Progress
    {
        get { return this._progress; }
        set
        {
            this._progress = value;
            this.OnPropertyChanged("Progress");
        }
    }
    public string Message
    {
        get { return this._message; }
        set
        {
            this._message = value;
            this.OnPropertyChanged("Message");
        }
    }

    public string SubMessage
    {
        get { return this._submessage; }
        set
        {
            this._submessage = value;
            this.OnPropertyChanged("SubMessage");
        }
    }

    public bool IsIndeterminate
    {
        get { return this._isindeterminate; }
        set
        {
            this._isindeterminate = value;
            this.OnPropertyChanged("IsIndeterminate");
        }
    }

    public bool Visible
    {
        get { return this._visible; }
        set
        {
            this._visible = value;
            this.OnPropertyChanged("Visible");
        }
    }

    void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
 }

Класс Status:

public class Status
{
    public static void Initialise(StatusBar status, string _message, string _submessage, int _min, int _max, double _progress, bool _visible, bool _isindeterminate)
    {
        status.Visible = _visible;

        if (_isindeterminate == false)
        {
            status.Message = _message;
            status.SubMessage = _submessage;
            status.Progress = _progress;
            status.Min = _min;
            status.Max = _max;
            status.IsIndeterminate = _isindeterminate;
        }
        else
        {
            status.Message = _message;
            status.IsIndeterminate = _isindeterminate;
        }
    }

    public static void UpdateProgress(StatusBar status, double _progress)
    {
        if (_progress == status.Max)
        {
            Complete(status);
        }
        else
        {
            status.Progress = _progress;
        }
    }

    public static void UpdateMessage(StatusBar status, string _message)
    {
        status.Message = _message;
    }

    public static void UpdateSubMessage(StatusBar status, string _submessage)
    {
        status.SubMessage = _submessage;
    }
    public static void UpdateProgressMessage(StatusBar status, string _message, double _progress)
    {
        status.Message = _message;
        status.Progress = _progress;
    }

    public static void Complete(StatusBar status)
    {
        status.Message = "Ready";
        status.SubMessage = " ";
        status.Min = 0;
        status.Max = 0;
        status.Progress = 0;
        status.Visible = false;
        status.IsIndeterminate = false;
    }
}

Для создания zip-файла и обновления строки состояния у меня в настоящее время есть следующее:

string sourceDirectory = "C:\\Access\\Test";
string archive = @"C:\Access\Test.zip";

Status.Initialise(statusbar, "Creating Zip File...", "", 0, 100, 0, true, false);

Backup.CreateFromDirectory(sourceDirectory, archive,
        new BasicProgress<double>(p => Status.UpdateProgressMessage(statusbar, $"{p:P2} archiving complete", p)));

Код выше работаети файл Zip создан.
Однако о прогрессе сообщается только после завершения процесса, а не во время процесса.

Как я могу изменить это, чтобы обновить ход процесса создания файла ZIP?

...