Я работаю над проектом, который требует от меня многозадачности на контрольные суммы md5. Я создал очень простой способ обработки контрольных сумм md5, создав новый поток и используя метод, который позволяет мне повторно использовать разные алгоритмы.
Здесь Код для моего нового потока:
private readonly Thread md5Check_ = new Thread(new ThreadStart(md5Check));
Здесь обработчик для этого потока:
private static void md5Check()
{
string config_integrity = GetChecksum(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "/file.txt", Algorithms.MD5,).ToLower();
}
(Это написано в том же файле MainWindow.xaml.cs) Здесь метод GetChecksum:
public static string GetChecksum(string fileName, HashAlgorithm algorithm)
{
if (File.Exists(fileName))
{
using (var stream = new BufferedStream(File.OpenRead(fileName), 100000))
{
return BitConverter.ToString(algorithm.ComputeHash(stream)).Replace("-", string.Empty);
}
}
else
{
return "error";
}
}
И алгоритмы:
public static class Algorithms
{
public static readonly HashAlgorithm MD5 = new MD5CryptoServiceProvider();
public static readonly HashAlgorithm SHA1 = new SHA1Managed();
public static readonly HashAlgorithm SHA256 = new SHA256Managed();
public static readonly HashAlgorithm SHA384 = new SHA384Managed();
public static readonly HashAlgorithm SHA512 = new SHA512Managed();
public static readonly HashAlgorithm RIPEMD160 = new RIPEMD160Managed();
}
Мне было интересно, как новый поток (md5Check_) вызывает метод getChecksum в основном потоке, если фактические вычисления будут вычисляться по новому потоку (md5check) или основному потоку, как если бы файл был 1 ГБ или 2 ГБ, мое приложение могло появиться авария.
Любой метод, вызванный из потока, будет выполняться в вызывающем потоке, если вы вручную не отправите его через Dispatcher (в WPF) в другом потоке.
Также в вашем случае вы можете проверить себя, используя свойство Thread.CurrentThread в методе GetChecksum(), чтобы узнать, в каком потоке он выполняется в настоящий момент.
С текущим кодом (при условии, что вы вызываете md5Check_.Start()
где-то), ваш код будет запущен в созданном вами потоке (md5Check_).
Это будет работать в новом отдельном потоке