Раз поток должен работать автономно и не зависеть от главного потока, то я сделал следующее:
- написал компонент, единственной задачей которого является обновление таблицы.
- при создании экземпляра компонента, ему передаются в качестве параметров заполненная таблица в ДатаСет, sql- команда и колекция экземпляров класса, определяющего составные части адреса.
Код компонента
- Код: Выделить всё
Public Class Component1
Inherits System.ComponentModel.Component
Public myThread As System.Threading.Thread
Public m_count As Double
Public m_sql As String
Public m_dt As DataTable
Public m_adComp As clsAddressComponent
Public m_comps As Collection
Private m_db As clsAccessToDB
Public Event WorkComplete(ByVal count As Double)
Public Sub New(ByVal comps As Collection, ByVal dt As DataTable, ByVal sql As String)
m_sql = sql
m_dt = dt
m_comps = comps
End Sub
Public Sub FillTableInDataBase()
m_db = New clsAccessToDB(My.Settings.DataBase)
m_count = 0
For Each dr As DataRow In m_dt.Rows
SyncLock m_dt
m_db.AddSqlParameter("RowId", dr("RowId"))
For Each adComp In m_comps
m_db.AddSqlParameter(adComp.NamePost, dr(adComp.NamePost))
Next
End SyncLock
m_db.DoNonQuery(m_sql)
m_db.ClearSqlParametrs()
m_count += 1
Next
RaiseEvent WorkComplete(m_count)
End Sub
Public Sub StartThread()
myThread = New System.Threading.Thread(AddressOf FillTableInDataBase)
myThread.Start()
End Sub
End Class
А так он создается и вызывается его метод
- Код: Выделить всё
Private Sub btnSchrijfXML_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSchrijfXML.Click
tableName = txtTableName.Text
FillAddressComponents() 'создание колекции экз. классов описывающих составные части адреса
CreateTable(tableName) ' создание татлицы нужной структуры в БД
FillTableDataSet(tableName) ' вызов этой таблицы в ДатаСет и заполнение её значениями
Dim sql As String = MakeSql() ' динамическое создание sql команды INSERT INTO
component1 = New Component1(comps, dtOut, sql)
component1.StartThread()
AddHandler component1.WorkComplete, AddressOf TableIsFill
FillPsCode(tableName)
ShowMailingTable(tableName)
WriteXml()
End Sub
Если в компоненте не использовать Thread то он работает на Ура.
А если использовать Thread, то после обновления первой строки в таблице БД выскакивает исключение: http://img171.*** imageshack.us — идиотская служба, не пользуйтесь ею ***/img171/6303/foutif3.jpg
И я не понимаю почему студии не нравиться что, поменялись параметры sql-команды?
Каким образом можно заставить выполняться обновление таблицы в БД в отдельном потоке, что бы на это время не "зависала" вся программа.
Или подскажите где можно почитать нормально изложенный материал о том, как работает принцип многопоточности. Ведб все серьезные программы работают многопоточно, без Application.DoEvents().
И при этом потоки используют параметры.
ЗЫ В msdn смотрел материал изложен куцо и примитивно. Если задача чуть посложнее, на основании того, что они там пишут ничего не решить.