Я пытаюсь вычислить хэш-файл md5 и поместить его в текстовое поле, у меня также есть ProgressBar, который должен продолжать работать, пока хеш, если он вычисляется, я устанавливаю ProgressBar в Marquee, а панель будет работать, пока я выберу файл, но как только начнется вычисление хеша, бар замерзает, пока он не будет выполнен. Вот мой код:C# ProgressBar Freezing
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Calcula_MD5_BAR
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Stopwatch timer = new Stopwatch();
var openFileDialog1 = new OpenFileDialog();
progressBar1.Style = ProgressBarStyle.Marquee;
progressBar1.MarqueeAnimationSpeed = 30;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
timer.Start();
textBox1.Text = GetFileMD5Hash(openFileDialog1.FileName);
timer.Stop();
lblTime.Text = timer.Elapsed.ToString();
progressBar1.Style = ProgressBarStyle.Continuous;
progressBar1.Increment(100);
}
progressBar1.MarqueeAnimationSpeed = 0;
}
protected string GetFileMD5Hash(string nomeArquivo)
{
FileStream file = new FileStream(nomeArquivo, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(file);
file.Close();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
}
}
Это совершенно нормально. Индикатор выполнения не может перерисовываться, ваша ветка пользовательского интерфейса отключена в лесу, что-то делает, и не заботится о потребностях в пользовательских интерфейсах. Пользовательский интерфейс полностью заморожен, он не реагирует на ввод и не перерисовывает себя. Используйте BackgroundWorker для запуска метода GetFileMD5Hash(). –
Ваша функция 'GetFileMD5Hash (openFileDialog1.FileName)' блокирует ее. вы должны запустить его в другом потоке – bansi
Вам нужно переместить интенсивную работу в отдельный поток, таким образом, поток пользовательского интерфейса может свободно управлять пользовательским интерфейсом. Изучите [BackgroundWorker] (http://msdn.microsoft.com/en-us/library/cc221403 (v = vs.95) .aspx) – musefan