Cześć wszystkim!
Tak jak w temacie wspomniałem chciałbym przyspieszyć wykonywanie tego kodu:
cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
Task.Factory.StartNew(() =>
{
token.ThrowIfCancellationRequested();
foreach (var obj in listBox1.Items)
{
string dir = Convert.ToString(obj);
listBox3.DataSource = GetFileList("*.*", dir).ToArray();
int count = listBox3.Items.Count;
for (int i = 0; i < count; i++)
{
listBox5.Items.Add(listBox3.Items[i].ToString());
}
}
string filecount = Convert.ToString(listBox5.Items.Count);
textBox1.Text = filecount;
ExecuteSecure(() => label2.Text = "Sprawdzono: 0 z " + filecount);
ExecuteSecure(() => label5.Visible = false);
ExecuteSecure(() => timer4.Start());
ExecuteSecure(() => progressBar1.Value = 0);
foreach (var file in listBox5.Items)
{
if (textBox5.Text == "0")
{
ExecuteSecure(() => button1.Visible = true);
string obj = Convert.ToString(file);
try
{
ExecuteSecure(() => label4.Text = obj);
try
{
using (var md5 = MD5.Create())
{
using (var stream = new BufferedStream(File.OpenRead(obj), 720000000))
{
var md5Check = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "").ToLower();
string md5key = Convert.ToString(md5Check);
textBox6.Text = md5key;
if (listBox2.Items.Contains((textBox6.Text)))
{
ExecuteSecure(() => listBox4.Items.Add(obj));
string threatcount = Convert.ToString(listBox4.Items.Count);
ExecuteSecure(() => textBox3.Text = foundcount);
ExecuteSecure(() => label3.Text = "Liczba znalezionych: " + foundcount);
}
}
}
}
catch
{
}
}
catch
{
}
string filecount2 = Convert.ToString(listBox5.Items.Count);
int scnnr = Convert.ToInt32(textBox2.Text);
scnnr = scnnr * 1 + 1 * 1;
ExecuteSecure(() => textBox2.Text = Convert.ToString(scnnr));
ExecuteSecure(() => label2.Text = "Znaleziono: " + scnnr + " z " + filecount2);
int step = Convert.ToInt32(textBox2.Text);
int final = Convert.ToInt32(textBox1.Text);
int precent = 0;
precent = (step * 100) / (final * 1);
ExecuteSecure(() => textBox4.Text = Convert.ToString(precent));
ExecuteSecure(() => progressBar1.Value = precent);
ExecuteSecure(() => CheckShieldLauncher.Properties.Settings.Default.ScanProgress = Convert.ToString(precent) + "%");
}
else
{
Scanner.Properties.Settings.Default.ScanStatus = "Gotowe!";
Scanner.Properties.Settings.Default.ScanProgress = "0%";
}
}
}, token);
Chodzi mi o to, że program wykonuje ten kod wykorzystując tylko 1 wątek (Drugi wątek odpowiada za aktualizację informacji w oknie programu) i robi to bardzo wolno przy okazji zawieszając się np. na pliku 573 z 1 938. Pliki są różnego typu od wielkich po takie małe i nawet na małych plikach po 100 KB program potrzebuje po kilka sekund na przeliczenie MD5. Jak można to udoskonalić?
Pozdrawiam!