Судя по комментариям, существует длительный фоновый процесс, который должен публиковать обновления в пользовательском интерфейсе.
Это легко сделать с помощью класса Progress и * 1005.* IProgress интерфейс.Это описано в Включение выполнения и отмены в Async APIs . Progress может вызвать событие или вызвать обратный вызов Action<T>
в потоке, в котором он был создан.Метод IProgress.Report позволяет другим потокам отправлять сообщения в Progress
При копировании из примера статьи этот метод обрабатывает изображения в фоновом потоке.Каждый раз, когда он хочет сообщить о прогрессе, он вызывает progress.Report(message);
async Task<int> UploadPicturesAsync(List<Image> imageList, IProgress<string> progress)
{
int totalCount = imageList.Count;
int processCount = await Task.Run<int>(() =>
{
foreach (var image in imageList)
{
//await the processing and uploading logic here
int processed = await UploadAndProcessAsync(image);
if (progress != null)
{
var message=$"{(tempCount * 100 / totalCount)}";
progress.Report(message);
}
tempCount++;
}
return tempCount;
});
return processCount;
}
Все, что нужно, это создать новый экземпляр Progress в потоке пользовательского интерфейса перед запуском асинхронного метода:
void ReportProgress(string message)
{
//Update the UI to reflect the progress value that is passed back.
txtProgress.Text=message;
}
private async void Start_Button_Click(object sender, RoutedEventArgs e)
{
//construct Progress<T>, passing ReportProgress as the Action<T>
var progressIndicator = new Progress<int>(ReportProgress);
//load the image list *before* starting the background worker
var folder=txtPath.Text;
var imageList=LoadImages(folder);
//call async method
int uploads=await UploadPicturesAsync(imageList, progressIndicator);
}
Чтение из пользовательского интерфейса
Еще одна важная вещь заключается в том, что UploadPicturesAsync
не не пытается прочитать свои входные данные из элемента пользовательского интерфейса, в зависимости от того, что это может быть.Он принимает входные данные, список изображений, в качестве параметра.Это облегчает работу в фоновом режиме, упрощает тестирование и значительно упрощает изменение.
Например, вместо чтения из текстового поля код можно изменить, чтобы отобразить диалоговое окно просмотра папок.