Jump to content

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


Recommended Posts

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

Edited by Shadow TH
Link to comment
Share on other sites

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

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

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

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

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

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

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

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

Link to comment
Share on other sites

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

Вот допустим я объявил поток. Внутри поточного метода (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.

Edited by Shadow TH
Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...