Как я могу сообщать о ходе выполнения метода в классе в режиме реального времени?
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
}
В этом случае ожидаемым результатом будет обновление строки в каждом цикле без завершения метода.
Вероятно, он обновляет его, однако, поскольку он работает в потоке пользовательского интерфейса, он блокирует код за кулисами, что позволяет ему показать вам измененное значение. Затем, принимая во внимание, что вы никогда не говорите ему обновить панель. События - хороший способ справиться с "onValueChange"
Вы можете реорганизовать свой метод для асинхронного запуска и передать ему объект IProgress
:
public async Task ShowStatusAsync(IProgress<StatusProgress> progress)
{
...
progress?.Report(new StatusProgress(...));
}
Вот дополнительная информация об этом шаблоне: https://docs.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/task-based-asynchronous-pattern-tap
Вы можете добавить событие в свой класс 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, вероятно, проще.
Вам нужно использовать Мероприятия.