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

Многопоточность в приложениях 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 не работал... мало что могу сказать

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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

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

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