Как передать Рабочий объект в потоковый пул используя Visual C# .NET

В данной статье используется следующее пространство имен Microsoft .NET Framework Class Library:
  • System.Threading

СОДЕРЖАНИЕ

Аннотация

В данной статье дается пошаговое описание процесса передачи метода в потоковый пул для выполнения.

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

Требования

В следующем списке приводится рекомендуемое аппаратное и програмное обеспечение, сетевая инфраструктура и требуемые пакеты исправлений:
  • Visual Studio .NET
В данной статье подразумевается, что Вы знакомы со следующими темами:
  • Язык программирования Visual C#

Создание приложения на Visual C#, которое использует потоковый пул

  1. Запустите Microsoft Visual Studio .NET.
  2. Создайте новый проект Windows Visual C# с названием PoolDemo.
  3. Используйте панель инструментов для добавления элемента управления Button на форму. По умолчанию, кнопка получает имя "button1".
  4. Щелкните правой кнопкой мыши на форме и выберите View Code.
  5. Вставьте инструкцию using после существующих инструкций using, но до объявления пространства имен PoolDemo:
    using System.Threading;
  6. Переключитесь обратно в Design view и дважды щелкните button1. Вставьте следующий код в обработчик события button1_Click:
    private void button1_Click(object sender, System.EventArgs e)
    {
    WaitCallback wcb = new WaitCallback(GetSysDirSize);
    try
    {
    ThreadPool.QueueUserWorkItem(wcb);
    MessageBox.Show("Рабочий объект был поставлен в очередь");
    }
    catch (Exception ex)
    {
    MessageBox.Show("Ошибка: " + ex.Message);
    }
    }
  7. Вставьте следующий код в тело класса Form1. Метод GetSysDirSize посчитает общее количество байт которые хранятся в системной папке. GetSysDirSize вызывает другой метод с именем DirSize для выполнения вычисления.

    Примечание: Для запуска этой задачи потребуется некоторое время.
    private void GetSysDirSize(object state)
    {
    long total_length = DirSize(Environment.SystemDirectory);
    this.Text = total_length.ToString();
    }

    private long DirSize(string path)
    {
    long sz = 0;
    System.IO.DirectoryInfo d = new System.IO.DirectoryInfo(path);

    // Список файлов.
    foreach(System.IO.FileInfo f in d.GetFiles())
    {
    sz += f.Length;
    }

    // Рекурсия в директориях.
    foreach(System.IO.DirectoryInfo dx in d.GetDirectories())
    {
    sz += DirSize(dx.FullName);
    }

    return sz;
    }

Тестирование примера

  1. Нажмите CTRL+F5 для запуска приложения.
  2. При появлении формы щелкните кнопку. При появлении окна сообщения Рабочий объект был поставлен в очередь нажмите OK для его закрытия и возвращения в главную форму. После короткой задержки общий размер файлов в системной папке будет показан в заголовке формы. Продолжительность задержки зависит от скорости Вашего компьютера и количества файлов в системной папке. Подсчет размера файлов происходит в потоке потокового пула.
Свойства

Номер статьи: 315460 — последний просмотр: 3 марта 2003 г. — редакция: 1

Отзывы и предложения