Bagaimana cara mengirimkan parameter ke Thread.ThreadStart()
metode dalam C #?
Misalkan saya memiliki metode yang disebut 'unduh'
public void download(string filename)
{
// download code
}
Sekarang saya telah membuat satu utas dalam metode utama:
Thread thread = new Thread(new ThreadStart(download(filename));
jenis metode kesalahan yang diharapkan.
Bagaimana saya bisa meneruskan parameter ThreadStart
dengan metode target dengan parameter?
c#
.net
multithreading
Swapnil Gupta
sumber
sumber
Jawaban:
Yang paling sederhana adalah adil
Keuntungan dari ini (lebih
ParameterizedThreadStart
) adalah bahwa Anda dapat melewati beberapa parameter, dan Anda mendapatkan pemeriksaan waktu kompilasi tanpa harus dilemparkan dariobject
semua waktu.sumber
new Thread(delegate() { download(filename); });
Lihat contoh ini:
Anda pertama-tama membuat utas dengan mengirimkan delegasi ke metode pekerja dan kemudian memulainya dengan metode Thread.Start yang menjadikan objek Anda sebagai parameter.
Jadi dalam kasus Anda, Anda harus menggunakannya seperti ini:
Tetapi metode 'unduh' Anda masih perlu mengambil objek , bukan string sebagai parameter. Anda bisa melemparkannya ke string di tubuh metode Anda.
sumber
Anda ingin menggunakan
ParameterizedThreadStart
delegasi untuk metode utas yang mengambil parameter. (Atau tidak ada sama sekali sebenarnya, dan biarkanThread
konstruktor menyimpulkan.)Contoh penggunaan:
sumber
Anda juga bisa
delegate
seperti itu ...sumber
Sebagai tambahan
sumber
Anda dapat merangkum fungsi utas (unduh) dan parameter yang diperlukan (nama berkas) di kelas dan menggunakan delegasi ThreadStart untuk menjalankan fungsi utas.
sumber
Saya akan merekomendasikan Anda untuk memiliki kelas lain yang disebut File.
Dan dalam kode pembuatan utas Anda, Anda membuat instance file baru:
sumber
Bagaimana dengan ini: (atau apakah boleh menggunakan seperti ini?)
sumber
Menurut pertanyaan Anda ...
... dan kesalahan yang Anda temui, Anda harus memperbaiki kode Anda dari
untuk
Namun, pertanyaannya lebih kompleks seperti pada awalnya.
The
Thread
kelas saat (4.7.2) menyediakan beberapa konstruktor danStart
metode dengan overloads.Konstruktor yang relevan untuk pertanyaan ini adalah:
dan
baik yang mengambil
ThreadStart
delegasi atauParameterizedThreadStart
delegasi.Delegasi yang sesuai terlihat seperti ini:
Jadi seperti yang bisa dilihat, konstruktor yang tepat untuk digunakan tampaknya adalah orang yang mengambil
ParameterizedThreadStart
delegasi sehingga beberapa metode sesuai dengan tanda tangan yang ditentukan dari delegasi dapat dimulai oleh utas.Contoh sederhana untuk instanciating
Thread
kelas akan menjadiatau hanya
Tanda tangan dari metode yang sesuai (disebut
Work
dalam contoh ini) terlihat seperti ini:Yang tersisa adalah memulai utas. Ini dilakukan dengan menggunakan keduanya
atau
Sementara
Start()
akan memulai utas dan meneruskannull
sebagai data ke metode,Start(...)
dapat digunakan untuk melewatkan apa pun ke dalamWork
metode utas.Namun ada satu masalah besar dengan pendekatan ini: Segala sesuatu yang dilewatkan ke dalam
Work
metode dilemparkan ke objek. Itu berarti dalamWork
metode itu harus dilemparkan ke tipe asli lagi seperti pada contoh berikut:Casting adalah sesuatu yang biasanya tidak ingin Anda lakukan.
Bagaimana jika seseorang melewati sesuatu yang bukan string? Karena ini kelihatannya tidak mungkin pada awalnya (karena ini adalah metode saya, saya tahu apa yang saya lakukan atau metode ini bersifat pribadi, bagaimana mungkin seseorang bisa memberikan apa pun padanya? ) Anda mungkin berakhir dengan kasus seperti itu karena berbagai alasan . Karena beberapa kasus mungkin tidak menjadi masalah, yang lain juga. Dalam kasus seperti itu, Anda mungkin akan berakhir dengan sesuatu
InvalidCastException
yang mungkin tidak akan Anda perhatikan karena itu hanya mengakhiri utas.Sebagai solusi Anda akan mengharapkan untuk mendapatkan
ParameterizedThreadStart
delegasi generik seperti diParameterizedThreadStart<T>
manaT
akan menjadi tipe data yang ingin Anda sampaikan ke dalamWork
metode. Sayangnya sesuatu seperti ini belum ada (belum?).Namun ada solusi yang disarankan untuk masalah ini. Ini melibatkan pembuatan kelas yang berisi keduanya, data yang akan diteruskan ke utas serta metode yang mewakili metode pekerja seperti ini:
Dengan pendekatan ini Anda akan memulai utas seperti ini:
Jadi dengan cara ini Anda cukup menghindari casting dan memiliki cara yang aman untuk memberikan data ke utas ;-)
sumber
di sini adalah cara yang sempurna ...
sumber