Будет ли запускать отдельный поток, который использует метод из основного потока, по-прежнему запускать его в основном потоке? (С #)

1

Я работаю над проектом, который требует от меня многозадачности на контрольные суммы 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 ГБ, мое приложение могло появиться авария.

Теги:
multithreading
wpf
md5sum

3 ответа

2
Лучший ответ

Любой метод, вызванный из потока, будет выполняться в вызывающем потоке, если вы вручную не отправите его через Dispatcher (в WPF) в другом потоке.

Также в вашем случае вы можете проверить себя, используя свойство Thread.CurrentThread в методе GetChecksum(), чтобы узнать, в каком потоке он выполняется в настоящий момент.

  • 0
    Спасибо, Рохин Ватс.
2

С текущим кодом (при условии, что вы вызываете md5Check_.Start() где-то), ваш код будет запущен в созданном вами потоке (md5Check_).

  • 0
    Ты тоже. Thankzzz adv12.
2

Это будет работать в новом отдельном потоке

  • 0
    Спасибо, Маклассен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню