Как я могу эффективно отображать состояние файла при использовании фонового потока?Эффективно отображать состояние файла при использовании фонового потока
Например, предположим, что у меня есть 100MB файл:
когда я делаю код ниже с помощью резьбы (только в качестве примера), в котором выполняется примерно 1 мин:
foreach(byte b in file.bytes)
{
WriteByte(b, xxx);
}
Но. .. если я хочу обновить пользователя, я должен использовать делегат для обновления пользовательского интерфейса из основного потока, код ниже берет - FOREVER - буквально я не знаю, как долго я все еще жду, я создал этот пост, а его нет даже 30% сделано.
int total = file.length;
int current = 0;
foreach(byte b in file.bytes)
{
current++;
UpdateCurrentFileStatus(current, total);
WriteByte(b, xxx);
}
public delegate void UpdateCurrentFileStatus(int cur, int total);
public void UpdateCurrentFileStatus(int cur, int total)
{
// Check if invoke required, if so create instance of delegate
// the update the UI
if(this.InvokeRequired)
{
}
else
{
UpdateUI(...)
}
}
Для измерения относительного времени в цикле гораздо лучше использовать 'Секундомер' или даже' DateTime.UtcNow', которые намного быстрее, чем 'DateTime.Now'. –
Хорошая точка. Я также не понимал, что DateTime.UtcNow работает быстрее (без изменения часового пояса). Это всегда удовольствие, чтобы узнать что-то от ответа на что-то еще! Вы также можете использовать System.Timer для обновления пользовательского интерфейса, особенно если работа выполняется в другом потоке. –
Мне нравится этот подход, лучший пока, спасибо ebpower – schmoopy