#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, вероятно, проще.