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

Tentang Yuniar

Penulis lebih banyak bekerja menggunakan teknologi Microsoft ASP.net terutama yang berkaitan dengan aplikasi MapXtreme.net dari MapInfo. Tapi sekarang udah tidak pernah lagi membuat aplikasi MapXtreme.

Posted on 19 Desember 2011, in .NET, Desktop and tagged , . Bookmark the permalink. 2 Komentar.

  1. gan, bagaimana bila ada beberapa thread yang dipanggil secara bersamaan/ thread yang dipanggil itu jumlahnya dinamis, gimana codingnya, thx

Tinggalkan Balasan

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Ubah )

Twitter picture

You are commenting using your Twitter account. Log Out / Ubah )

Facebook photo

You are commenting using your Facebook account. Log Out / Ubah )

Connecting to %s

Ikuti

Get every new post delivered to your Inbox.