Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Многопоточность в приложениях VB.NET


Рекомендуемые сообщения

Пишу прогу. Она периодически работает с файлами (а именно, копирует их из одной директории в другую). Иногда размер файлов слишком большой и при использовании стандартной функции FileCopy в VB.NET при выполнении операции копирования форма приложения зависает до тех пор, пока копирование не будет завершено. Я где-то читал про использование так называемых потоков. Одним словом, как я понял, для копирования файлов можно выделить отдельный поток, в результате чего форма не будет зависать и во время копирования с программой можно будет параллельно дальше работать, а не ждать пока копирование будет завершено. Теперь вопрос: как работать с потоками в VB.NET?

Изменено пользователем Shadow TH
Ссылка на комментарий
Поделиться на другие сайты

Система многопоточности в .net проста донельзя.

Нам нужно создать метод, который будет выполнятся в отдельном потоке, метод должен быть без параметров и не должен возвращать результат.

Пусть у нас это будет метод ThreadFileCopy внутри которого содержится обычный код.

Теперь в нужном месте нужно создать поток и запустить его:

Dim FileThread As New System.Threading.Thread(AddressOf ThreadFileCopy)FileThread.Start()

Подробнее можно прочитать тут: http://msdn.microsoft.com/library/rus/defa...eethreading.asp

Когда потоки используются очень часто для одних и тех же действий, имеет смысл вынести все конструкции потока в отдельный класс, в инициализации которого происходит создание и запуск потока, а так же который реализует нужные функции потока черз свои методы (например прирывание работы потока при отмене пользователем)

Важно: по умолчанию все потоки кроме того что запущен из метода main() системой, при запуске приложения создаются вторичными, то есть когда завершится работа всех первичных потоков все вторичные потоки оборвутся и работа приложения будет завершена. Как сделать поток первичным читайте в документации.

Ссылка на комментарий
Поделиться на другие сайты

С созданием и запуском потоков разобрался. Но всё же остались кое-какие вопросы.

Вот допустим я объявил поток. Внутри поточного метода (ThreadFileCopy в нашем случае) могут располагаться различные операторы. Однако доступ к объектам из другого потока (скажем, надо изменить значение элемента ProgressBar) получить не удаётся: ввожу строку "ProgressBar1.Value = i" внутри метода ThreadFileCopy и во время работы программы как только компилятор доходит до этого оператора начинает ругаться - Cross-thread operation not valid: Control 'ProgressBar1' accessed from a thread other than the thread it was created on.

В MSDN находил что-то про использование оператора Invoke, но так ничего и не понял. :) Объясните, pls.

Изменено пользователем Shadow TH
Ссылка на комментарий
Поделиться на другие сайты

Насколько мне известно, переменные из другого потока доступны только для чтения, в этом и ошибка, когда вы пытаетесь записать данные другому потоку.

Как вариант можно не писать данные из потока 2 в поток 1, а читать данные потоком 1 из потока 2

В C# еще можно напрямую обратится к памяти, но в VB.NET насколько мне известно такой возможности не продумано...

С Invoke не работал... мало что могу сказать

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...