Как обновить индикатор выполнения из серии внутренних методов в Winform 2019 - PullRequest
0 голосов
/ 08 января 2020

У меня есть индикатор выполнения в главной форме, и в нем есть метод с именем MethodA(). Внутри этого methodA() он вызывает другой метод Class1.MethodB(), а внутри этого methodB() он вызывает другой метод Class2.MethodC(). И это MethodC() вызывает другой метод Class3.MethodD(). Во всех этих методах происходит какой-то длительный процесс:

class MainForm : Form
{
    void MethodA()
    {
        // ...

        instanceOfClass1.MethodB();

        // ...
    }
}

class Class1
{
    void MethodB()
    {
        // ...

        instanceOfClass2.MethodC();

        // ...
    }
}

class Class2
{
    void MethodC()
    {
        // ...

        instanceOfClass3.MethodD();

        // ...
    }
}

Вызовы методов - это все вызовы методов экземпляра, а не вызовы stati c.

Как я могу обновить индикатор выполнения значение здесь? Когда кнопка щелкает, индикатор выполнения должен запускаться и заканчиваться, когда Class3.MethodD() останавливает выполнение?

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

1 Ответ

0 голосов
/ 08 января 2020

При условии, что вы можете изменить другие методы, чтобы изменить их параметры, а затем передать IProgress<T>. (T является произвольным, хотя, если вы хотите обновить только индикатор выполнения, используйте IProgress<Single> со значениями 0-1.0 для представления от 0 до 100%).

Избегайте использования static объектов, методы или состояние для передачи информации о ходе выполнения внутри вашей программы.

Примерно так:

class MainForm
{
    private class MainFormProgress : IProgress<Single>
    {
        private readonly ProgressBar pb;
        private const Int32 _max = 10000; // Using values above 100 animate smoother if the ProgressBar is wider than 100 pixels.

        public MainFormProgress( ProgressBar pb )
        {
            this.pb = pb ?? throw new ArgumentNullException(nameof(pb));
            this.pb.Minimum =    0;
            this.pb.Maximum = _max;
            this.pb.Value   =    0;
        }

        public void Report( Single value )
        {
            // You MAY need to wrap this in a call to BeginInvoke or Invoke if this is being run on a background thread.
            this.pb.Value = (Int32)( value * _max );
        }
    }

    void MethodA()
    {
        MainFormProgress progress = new MainFormProgress( this.progressBar );

        instanceOfClass1.MethodB( progress  );

        // ...
    }
}

class Class1
{
    void MethodB( IProgress<Single> progress )
    {
       // ...

        // do something

        progress.Report( 0.1 ); // we're 10% complete!

        instanceOfClass2.MethodC( progress );

        progress.Report( 0.75 ); // we're 75% complete!

        // ...
   }
}

// etc for the other classes

IProgress<T> также может использоваться в других контекстах, таких как приложения в режиме консоли и SignalR в ASP. NET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...