Threading Menggunakan Delegates
Threading satu cara menjalankan beberapa bagian program secara pararel. Tujuannya adalah agar aplikasi bisa lebih responsif.
Sebagai contoh:
Public Class AdmPropinsi
....
Public Delegate Function GetDataDelegate() As System.Data.DataSet
Public Function GetData() As System.Data.DataSet
Dim ds As New DataSet
Try
Using conn
If conn.State = ConnectionState.Closed Then conn.Open()
Using cmd
cmd.Connection = conn
cmd.CommandText = "Q_Select_Propinsi"
cmd.CommandType = CommandType.StoredProcedure
da = New OleDbDataAdapter()
da.SelectCommand = cmd
da.TableMappings.Add("TBR_PROV", "pro")
da.Fill(ds, "pro")
End Using
End Using
Catch ex As OleDb.OleDbException
Throw Exception
End Try
Return ds
End Function
End Class
Di Class diatas ada method GetData() yang akan mengambil informasi dari database dan disimpan ke dataset. Selain method juga didefinisikan delegate function yang juga bertipe sama, DataSet (Baris 3).
Untuk memanggil method diatas dan diproses secara paralel di thread yang lain,
Dim getDataDelegate As AdmPropinsi.GetDataDelegate Dim admprop As New AdmPropinsi(My.Settings.ConnectionStr) getDataDelegate = New AdmPropinsi.GetDataDelegate(AddressOf admprop.GetData) Dim arref As IAsyncResult = getDataDelegate.BeginInvoke(Nothing,Nothing) Dim hasil As DataSet = getDataDelegate.EndInvoke(arref)
Kode diatas akan menjalankan method GetData di thread yang lain, dijalankan secara paralel. Hanya untuk mendapatkan Dataset kode jadi lebih panjang dibandingkan cara yang biasa. Tapi proses jadi lebih cepat, karena jika menggunakan satu thread, proses akan dijalankan secara bergantian sesuai urutan prosesnya.
Sekarang bagaimana kalau Dataset yang dihasilkan akan di bind ke UI. Di aplikasi desktop, UI dijalankan di suatu thread. Jika method diatas di jalankan di thread kedua, sedangkan UI dijalankan di thread pertama, tentunya dataset yang diperoleh di thread kedua tidak bisa dikenali secara langsung oleh UI yang ada di thread pertama. Agar dataset di thread kedua dapat diterima UI di thread pertama, perlu ada tambahan kode.
1. Buat method-method yang diperlukan untuk memanggil kembali thread kedua
Private Delegate Sub BindPropinsiDelegate(ByVal data As DataSet)
Private dsprop As DataSet
Private Sub GetDataCallback(ByVal ar as IAsyncResult)
dsprop = getDataDelegate.EndInvoke(ar)
Dim update As New BindPropinsiDelegate(AddressOf BindPropinsiToControl)
Me.Invoke(update, New Object() {dsprop})
End Sub
Private Sub BindPropinsiToControl(ByVal data As DataSet)
BindToCombo(data) 'bind dataset ke combobox
BindToList(date) 'bind dataset ke Listview
End Sub
2. Jalankan prosesnya
Dim getDataDelegate As AdmPropinsi.GetDataDelegate Dim admprop As New AdmPropinsi(My.Settings.ConnectionStr) getDataDelegate = New AdmPropinsi.GetDataDelegate(AddressOf admprop.GetData) 'panggil method yang dibuat di nomor 1 diatas. getDataDelegate.BeginInvoke(AddressOf GetDataCallback, Nothing)
Semoga bermanfaat
Posted on 19 Desember 2011, in .NET, Desktop and tagged .NET, Threading. Bookmark the permalink. 2 Komentar.
gan, bagaimana bila ada beberapa thread yang dipanggil secara bersamaan/ thread yang dipanggil itu jumlahnya dinamis, gimana codingnya, thx
Sudah coba pake class System.Threading.Thread?