Как отслеживать состояние при хешировании файла? - PullRequest
2 голосов
/ 29 января 2012

Я создаю небольшое приложение, которое вычисляет хеш из любого файла для алгоритма хеширования нескольких типов.

Для простоты я остановлюсь только на одном алгоритме, интенсивно использующем процессор, и даже если размер файла составляет около 15 МБ, вычисление хэша занимает около получаса.

Я выполняю расчеты с помощью BackgroundWorker (я не уверен, что это правильный подход для расчетов, но я просто экспериментирую).

Теперь я хочу иметь индикатор выполнения, который будет отображать процессы хэширования, но я не знаю, как получить максимальное требуемое значение и куда поместить метод DoStep.

Есть идеи?

Мой код:

private void btnBrowse_Click(object sender, EventArgs e)
{
    ofdBrowse.Filter = "All Files|*.*";
    ofdBrowse.Title = "Open file.";

    if (ofdBrowse.ShowDialog() == DialogResult.OK)
    {
        txtPath.Text = ofdBrowse.FileName;

        bwWorker.RunWorkerAsync();
    }
}

private void bwWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    t5 = hash.HashSHA512(txtPath.Text);
}

void bwWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    txtSHA512.Text = t5;
}

Ответы [ 2 ]

6 голосов
/ 29 января 2012

Для того, чтобы иметь возможность отслеживать прогресс, вам придется делать хеш с небольшими приращениями.После этого вы сможете рассчитать процент файла, который будет сделан вами самостоятельно.

Для этого будут использованы блоки HashAlgorithm.TransformBlock и HashAlgorithm.TransformFinalBlock.

Вызовите TransformBlock в цикле и используйте события или BackgroundWorker.ReportProgress, чтобы сообщить о прогрессе пользовательскому интерфейсу.

Этот старый вопрос содержитответьте с хорошим примером использования TransformBlock, и в документах также есть пример для TransformBlock.

3 голосов
/ 29 января 2012

Я рекомендую не ссылаться на объекты пользовательского интерфейса в вашем событии DoWork. Вы должны исправить свой код примерно так:

bwWorker.RunWorkerAsync(ofdBrowser.FileName);
....
void bwWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    string filename = (string)e.Argument;
    ...
    e.Result = hash;
}

void bwWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    String hash = (string)e.Result;
    ...
}

Желаю тебе удачи с твоим маленьким приложением.

...