Как сообщить о ходе выполнения метода класса

#c#

#c#

Вопрос:

Как я могу сообщать о прогрессе метода в классе в режиме реального времени?

 public class Foo{
    public string Bar(){
        int i = 0;
        while(true)
        {
            i  ;
            //return i.ToString();
            if(i > 10) break;
        }
        return "Loop end";
    }
}


Foo foo = new Foo();

public void ShowStatus()
{
    string status = foo.Bar();
    //change the string value to each while loop
}
  

В этом случае ожидаемым результатом будет обновление строки для каждого цикла без необходимости завершения метода.

Комментарии:

1. Вам нужно использовать события .

2. Вероятно, он обновляет его, однако, поскольку он выполняется в потоке пользовательского интерфейса, он блокирует скрытый код, который позволяет ему показывать вам измененное значение. Затем, принимая во внимание, что вы никогда не говорите ему обновлять панель.. События — хороший способ обработки «onValueChange»

Ответ №1:

Вы можете реорганизовать свой метод для асинхронного запуска и передать IProgress ему объект:

 public async Task ShowStatusAsync(IProgress<StatusProgress> progress)
{
  ...
  progress?.Report(new StatusProgress(...));
}
  

Вот некоторая дополнительная информация об этом шаблоне:
https://learn.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/task-based-asynchronous-pattern-tap

Ответ №2:

Вы могли бы добавить событие в свой Foo класс:

 public delegate void ProgressEventHandler(object sender, ProgressEventArgs e);
public event ProgressEventHandler Progress;
  

… а затем подписаться на это событие из вашего другого класса:

 Foo foo = new Foo();
foo.Progress  = (sender, e) => { /* Do something */ };
  

… но вам нужно будет написать много кода, включая класс ProgressEventArgs , и переход на асинхронность с Progress универсальным классом, как предложил @Stefan, вероятно, проще.