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

About Yuniar

Penulis sekarang lebih banyak bekerja menggunakan teknologi Microsoft .NET secara umum dan TIDAK lagi menggunakan aplikasi MapXtreme.net dari MapInfo. Karena itu mohon maaf, jika pertanyaan-pertanyaan mengenai MapXtreme sudah tidak bisa saya jawab lagi.

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

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

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

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: