One of my first questions starting programming in Visual Studio WPF was how to run processes without freezing the GUI.
After learning the basic concepts of backgroundworkers and tasks in c sharp programming I wanted to know how to report task progress while the task was not yet finished.
I found all kind of solutions to update a progress bar. I also found solutions to use the result for a specific task.
Think still missing for me was to get a screen to show task progress, with detailed logging while the task was still running. In the end this article helped me finding a solution: https://social.technet.microsoft.com/wiki/contents/articles/19020.progress-of-a-task-in-c.aspx
To implement this logic in a solution I started with a form on which I added a button and a listbox.
The button got the following implementation:
private async void ButtonAsyncFileProcessing_Click(object sender, RoutedEventArgs e)
{
var progressIndicator = new Progress<MyTaskProgress>(ReportProgress);
await MyMethodAsync(progressIndicator);
}
For the progress indicator I added the following class:
public class MyTaskProgress
{
//current progress
public int CurrentProgressAmount { get; set; }
//total progress
public int TotalProgressAmount { get; set; }
//some message to pass to the UI of current progress
public List<string> CurrentProgressLogging { get; set; }
}
The async method I used for testing was this:
async Task MyMethodAsync(IProgress<MyTaskProgress> progress)
{
int sleepTime = 1000;
int totalAmount = 10000;
List<string> log = new List<string>();
for (int i = 0; i <= totalAmount;)
{
await Task.Delay(sleepTime);
log.Add(string.Format("On {0} Message", i));
progress.Report(new MyTaskProgress
{
CurrentProgressAmount = i, TotalProgressAmount = totalAmount, CurrentProgressLogging = log });
i = i + sleepTime;
}
}
The ReportProgress method used in the button click progressIndicator:
private void ReportProgress(MyTaskProgress progress)
{
UpdateScreen(progress.CurrentProgressLogging,
string.Format("{0} out of {1}",
progress.CurrentProgressAmount,
progress.TotalProgressAmount));
}
And this last method calls a UpdateScreen method:
private void UpdateScreen(List<string> info, string status)
{
lbOutput.Items.Clear();
foreach (string s in info)
{
lbOutput.Items.Add(s);
}
buttonAsyncFileProcessing.Content = "AsyncFileProcessing" +
"\n" + status;
}
The article that helped me understanding Tasks and backgroundworkers is: https://blog.stephencleary.com/2013/05/taskrun-vs-backgroundworker-intro.html