У меня есть следующий метод нажатия кнопки. В 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
Пользовательский интерфейс зависает при работе с использованием «async» и «await» ⇐ C#
Место общения программистов C#
1737140986
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[i].fileName, EXIF);
mediaFilesList[i].exif_date = mFile.exif_date;
mediaFilesList[i].fileSize = mFile.fileSize;
// Enqueue the updated file
updatedMediaFiles.Add(mediaFilesList[i]);
//fileQueue.Enqueue(mediaFilesList[i]);
});
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;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79365776/ui-freezes-when-running-using-async-and-await[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия