Пользовательский интерфейс зависает при работе с использованием «async» и «await»C#

Место общения программистов C#
Ответить
Anonymous
 Пользовательский интерфейс зависает при работе с использованием «async» и «await»

Сообщение Anonymous »

У меня есть следующий метод нажатия кнопки. В getImageExifDateLight нет обновлений пользовательского интерфейса. Он просто считывает дату exif для каждого файла в списке allFiles. allFiles будет содержать сотни и тысячи файлов. Моя проблема заключается в том, что когда он запускается, мой пользовательский интерфейс время от времени зависает (не полностью зависает) и имеет задержку ответов на другие мои клики, которые не зависят от этого обновления. Что я здесь делаю не так?
ConcurrentDictionary allFiles = new ConcurrentDictionary();

private async void button8_Click(object sender, EventArgs e)
{
if (allFiles != null && allFiles.Count > 0)
{
long fileCount = allFiles.Values.Sum(list => list.Count);

_cancellationTokenSource = new CancellationTokenSource();
var cancellationToken = _cancellationTokenSource.Token;

stsStatus.Text = $"Reading exif data. : {fileCount}, please wait ....";

allFiles = await Task.Run(async () =>
{
return await readAllEXIFdatesAsync(allFiles, _cancellationTokenSource.Token, chkEXIF.Checked);
},cancellationToken);

Task.WaitAll();

stsStatus.Text = $"All file exif scanned";
stsStatus.Text = $"{allFiles.Count}";
}
}

private async Task readAllEXIFdatesAsync(ConcurrentDictionary EXIF_Dictionary, CancellationToken cancellationToken, bool EXIF)
{
foreach (var key in EXIF_Dictionary.Keys)
{
//if (cancellationToken.IsCancellationRequested)
//break;

if (EXIF_Dictionary.TryGetValue(key, out var mediaFilesList))
{
if (cancellationToken.IsCancellationRequested)
break;

var updatedMediaFiles = new List();
//mediaFile mFile = new mediaFile();
//for (int i = 0; i < mediaFilesList.Count; i++)
Parallel.For(0, mediaFilesList.Count, i =>
{
// Reading EXIF and file size
var mFile = getImageExifDateLight(mediaFilesList.fileName, EXIF);

mediaFilesList.exif_date = mFile.exif_date;
mediaFilesList.fileSize = mFile.fileSize;

// Enqueue the updated file
updatedMediaFiles.Add(mediaFilesList);
//fileQueue.Enqueue(mediaFilesList);
});
EXIF_Dictionary[key] = updatedMediaFiles;
}
}
return EXIF_Dictionary;
}

private mediaFile getImageExifDateLight(string fileName, bool chkEXIF)
{
mediaFile mFile = new mediaFile();
mFile.fileName = fileName;
string exifdate;

if (chkEXIF)
{
try
{
var file = ImageFile.FromFile(fileName);
var exifDate = file.Properties.Get(ExifTag.DateTimeOriginal);

if (exifDate != null)
{
exifdate = exifDate.ToString();
}
else
{
exifdate = System.IO.File.GetLastWriteTime(fileName).ToString(); // Last time file modified.
}
}
catch
{
exifdate = System.IO.File.GetLastWriteTime(fileName).ToString(); // Last time file modified.
}
}
else
{
exifdate = System.IO.File.GetLastWriteTime(fileName).ToString(); // Last time file modified.
}

mFile.exif_date = exifdate.ToString();
mFile.fileSize = string.Format("{0:N2} MB", (Double)(new System.IO.FileInfo(fileName).Length) / (1024.0 * 1024.0));
return mFile;
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... -and-await
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»