Saat kita menulis program Remoting atau aplikasi lain, mau tidak mau kita harus berurusan dengan thread. .Net memungkinkan kita membuat thread dengan mudah, tetapi metode yang disediakan untuk membuat thread dan memulai thread tidak memberikan parameter yang jelas apakah saya ingin menggunakan utas untuk memulai metode dengan parameter di kelas? Berikut ini adalah pengenalan singkat tentang cara menggunakan kerangka kerja kaya yang disediakan oleh .NET untuk mengimplementasikan fungsi ini. Untuk memperkenalkan seluruh proses dengan detail yang jelas, saya membuat kelas .NET berikut, yang juga merupakan pembawa metode startup thread. Kelasnya terlihat seperti ini:
menggunakan Sistem;
namespace WindowsApplication1
{
/// <ringkasan>
/// Deskripsi ringkasan untuk UrlFetcher.
/// </ringkasan>
kelas publik MyClass{
// untuk metode 1
string pribadi _parameter;
public MyClass(parameter string){
this._parameter = parameter;
}
public void MyMethod1(){
if(this._parameter!=null){
// lakukan sesuatu
Console.Write(this._parameter )
;
// untuk metode 2
public MyClass(){}
// metode ini bersifat pribadi,Tetapi dapat berupa public atau
private lainnya void MyMethod2(parameter string){
// melakukan sesuatu
Console.Write(parameter);
//
Karena mendelegasikan WaitCallback parameter Tipe adalah objek
// Saya akan mengubahnya menjadi string.
public void MyMethod2(parameter objek){
this.MyMethod2((string)parameter
}
// untuk metode 3
string publik MyMethod3(parameter string){
return "Nilai parameternya adalah:"+parameter
;
// untuk mutil-parameter yang diteruskan
public string MyMutilParameters(string param1,string param2){
return "Hasil koneksi parameter 1 dan parameter 2 adalah: "+param1+param2
}
}
}
Hehe, bahasa Inggris saya kurang bagus, mohon maaf atas buruknya penulisan komentar (karena dalam bahasa Inggris). Saya rasa perlu bagi saya untuk membicarakan secara singkat tentang konten yang terdapat pada kelas di atas. Pertama, berisi dua konstruktor, satu dengan parameter dan satu lagi tanpa parameter (ini sengaja diatur). Saya pikir Anda akan menebaknya melalui nama metode lain di kelas. Saya akan memperkenalkan 3 metode untuk meneruskan parameter, dan kemudian saya akan memperkenalkannya satu per satu. Pertama, mari kita lihat cara memulai thread. Pertama, kita dapat menggunakan fungsi untuk membuat instance delegasi ThreadStart, lalu menggunakan instance ini sebagai parameter objek thread baru (Thread), dan terakhir Memulai thread tahu lebih banyak Silakan lihat bagian Thread pada dokumentasi MSDN untuk informasi lebih lanjut.
Untuk menguji hasil kami, saya membuat proyek WinForm, yang memiliki Formulir dan 4 tombol. Jika Anda memerlukan semua kode sumber, silakan kirim email ke [email protected] . Berikut penjelasan rinci masing-masing metode.
1. Gunakan konstruktor untuk meneruskan parameter
. Seperti yang kita ketahui bersama, kita dapat menggunakan konstruktor dengan parameter untuk membuat objek variabel internal dalam objek, dan kemudian menggunakan konstruktor tanpa parameter. Metode parameter untuk menggunakan parameter ini (berpura-pura menjadi parameter). Sederhananya, deklarasikan variabel di kelas khusus untuk menyimpan parameter yang diperlukan oleh fungsi, dan fungsi tersebut menjadi bentuk tanpa parameter. Masalah terbesar dengan metode ini adalah metode ini merusak enkapsulasi. Meskipun kita tidak dapat mengakses variabel-variabel ini secara langsung, bahaya tersembunyi selalu ada (atau tidak masalah jika terlihat tidak menyenangkan). Cuplikan kode berikut memberikan rincian tentang cara menggunakan metode ini untuk meneruskan parameter. Ini juga merupakan kode Klik untuk salah satu dari empat tombol yang disebutkan di atas (Tombol1). Agar parameter dapat diteruskan, saya mendefinisikan variabel sebagai berikut secara global di WinForm:
// Ini adalah nilai parameter
private string myParameter = "ParameterValuen";
Event tombolnya adalah sebagai berikut:
// meneruskan parameter ke thread dengan membangun
private void button1_Click( object sender, System.EventArgs e) {
MyClass instance = new MyClass(myParameter);
new Thread (new ThreadStart(instance.MyMethod1
)).Start()
;
kelas Go, dan kemudian memulai thread menggunakan metode yang disebutkan di atas, kita dapat melihat hasil eksekusi MyMethod1 di jendela output setelah menjalankan program (Anda juga dapat menggunakan TextBox atau yang lain untuk menampilkannya langsung di WinForm): ParameterNilai. Lihat saja fungsinya dan Anda akan melihat bahwa hasilnya benar. Bukankah ini sangat sederhana.
2. Gunakan ThreadPool untuk mewujudkan transfer parameter.
Pertama-tama kita dapat melihat bagaimana MSDN menjelaskan ThreadPool. Menyediakan kumpulan thread yang dapat digunakan untuk memposting item kerja, memproses I/O asinkron, menunggu atas nama thread lain, dan memproses timer. Lihat kumpulan metodenya, salah satunya disebut: QueueUserWorkItem. Untuk informasi rinci tentang kelas ini dan metode ini, silakan merujuk ke bantuan terkait MSDN. Yang perlu diperhatikan disini adalah parameter dari metode QueueUserWorkItem. Parameter WaitCallback adalah tipe delegasi. Parameter kedua adalah parameter yang diperlukan oleh instance delegasi (setelah membuat instance dengan suatu fungsi, yaitu fungsi), yaitu. dari tipe objek. Silakan lihat kode di bawah ini untuk detailnya.
// meneruskan parameter ke thread oleh ThreadPool
private void button2_Click(object sender, System.EventArgs e) {
MyClass
instance = new MyClass(
)
;
dari QueueUserWorkItem Parameternya bertipe objek, jadi kita perlu mendefinisikan dua versi MyMethod2 yang diubah ukurannya di MyClass untuk memenuhi parameter metode. Demikian pula, kita memasukkan parameter myParameter dan menjalankan program. Ketika kita mengklik Button2, hasil dari MyMethod2 yang mengeksekusi myParameter sebagai parameter akan muncul di jendela keluaran.
3. Selanjutnya adalah metode terakhir menggunakan delegasi asinkron untuk mewujudkan transfer parameter
. Demikian pula untuk informasi detail tentang delegasi, silakan merujuk ke MSDN yang sangat detail di atas. Kami akan menggunakan metode BeginInvoke dan EndInvoke di sini. Pertama, kami memberikan metode meneruskan parameter sebagai berikut:
// meneruskan parameter dengan
delegasi delegasi asynchronous string MyMethod3Delegate(string parameter);
private void button3_Click(object sender, System.EventArgs e) {
MyClass instance = new MyClass()
; myMethod3 = new MyMethod3Delegate(instance.MyMethod3);
myMethod3.BeginInvoke("parameterValue",new AsyncCallback(AfterMyMothod3),null);
public
void AfterMyMothod3(hasil IAsyncResult){
AsyncResult async = (AsyncResult)
hasil;
async.AsyncDelegate;
Console.WriteLine ("Nilai pengembalian panggilan fungsi: {0}n", DelegateInstance.EndInvoke(result)
}
Pertama, untuk menggunakan delegasi, kami mendeklarasikan delegasi MyMethod3Delegate, yang menentukan parameter dan mengembalikan nilai Fungsi yang berupa string memenuhi syarat, jadi kami mendefinisikan metode MyMethod3 di MyClass. Struktur fungsi ini sesuai dengan delegasi di atas, sehingga kita dapat menggunakan metode ini untuk membuat instance delegasi ketika Button3 diklik, dan kemudian kita memanggil metode ini secara asinkron. Untuk mendapatkan hasil pengembalian, kami menulis metode AfterMyMothod3 untuk menampilkan hasil eksekusi fungsi. Jalankan program dan klik Button3 untuk melihat bahwa hasil output di Output merupakan hasil eksekusi MyMethod3 dengan parameter. Terakhir, saya memberikan metode cara melewatkan beberapa parameter. Kodenya adalah sebagai berikut:
// mutil-parameter melewati
delegasi string MyMutilParamsDelegate(string parameter1,string parameter2);
private void button4_Click(pengirim objek, System.EventArgs e) {
MyClass instance = new MyClass()
; instance.MyMutilParameters );
mutilParams.BeginInvoke("param1","params2",new AsyncCallback(AfterMutilParams),null)
;
public void AfterMutilParams(hasil IAsyncResult){
AsyncResult async = (AsyncResult) hasil;
MyMutilParamsDelegate DelegateInstance = (MyMutilParamsDelegate) async.AsyncDelegate
Console.WriteLine ("Panggilan fungsi multi-parameter mengembalikan hasil: {0}n", DelegateInstance.EndInvoke( result ));
}
Karena keterbatasan tempat, kode tidak akan dijelaskan secara detail. Mohon koreksi saya jika ada ketidakakuratan. Terima kasih telah membaca! Informasi kontak: [email protected] ID Forum CSDN: cuike519
Dokumen referensi: