Karena Invoke/ BeginInvokemenerima Delegate(daripada delegasi yang diketik), Anda perlu memberi tahu kompiler jenis delegasi yang akan dibuat; MethodInvoker(2.0) atau Action(3.5) adalah pilihan umum (perhatikan bahwa mereka memiliki tanda tangan yang sama); seperti itu:
Bagaimana saya bisa meneruskan parameter ke solusi pertama Anda dalam jawaban ini? Saya maksudkan solusi ini: control.Invoke ((MethodInvoker) delegate {this.Text = "Hai";});
uzay95
1
Mengapa Metode Ekstensi dipanggil tanpa harus melakukan pemeran Eksplisit untuk Bertindak?
P.Brian.Mackey
Karena kompiler dapat menyimpulkan itu dari penggunaan.
RoboJ1M
1
Itu sama dengan bisa melakukan Form.Load += Loader()alih - alih yang lamaForm.Load += new EventHandler(Loader())
RoboJ1M
49
Sebenarnya Anda tidak perlu menggunakan kata kunci delegasi. Cukup berikan lambda sebagai parameter:
Anda perlu membuat jenis delegasi. Kata kunci 'delegate' dalam pembuatan metode anonim agak menyesatkan. Anda tidak membuat delegasi anonim tetapi metode anonim. Metode yang Anda buat dapat digunakan dalam delegasi. Seperti ini:
Demi kelengkapan, ini juga dapat dicapai melalui kombinasi metode Action / metode anonim:
//Process is a method, invoked as a method groupDispatcher.Current.BeginInvoke((Action)Process);//or use an anonymous methodDispatcher.Current.BeginInvoke((Action)delegate=>{SomeFunc();SomeOtherFunc();});
Saya memiliki masalah dengan saran lainnya karena saya terkadang ingin mengembalikan nilai dari metode saya. Jika Anda mencoba menggunakan MethodInvoker dengan nilai pengembalian, sepertinya tidak menyukainya. Jadi solusi yang saya gunakan adalah seperti ini (sangat senang mendengar cara untuk membuat ini lebih ringkas - Saya menggunakan c # .net 2.0):
// Create delegates for the different return types needed.privatedelegatevoidVoidDelegate();privatedelegateBooleanReturnBooleanDelegate();privatedelegateHashtableReturnHashtableDelegate();// Now use the delegates and the delegate() keyword to create // an anonymous method as required// Here a case where there's no value returned:publicvoidSetTitle(string title){
myWindow.Invoke(newVoidDelegate(delegate(){
myWindow.Text= title;}));}// Here's an example of a value being returnedpublicHashtableCurrentlyLoadedDocs(){return(Hashtable)myWindow.Invoke(newReturnHashtableDelegate(delegate(){return myWindow.CurrentlyLoadedDocs;}));}
// Thread-safe update on a form controlpublicvoidDisplayResult(string text){if(txtResult.InvokeRequired){
txtResult.Invoke((Action)delegate{DisplayResult(text);});return;}
txtResult.Text+= text +"\r\n";}
Bonus: tambahkan beberapa penanganan kesalahan, karena kemungkinan bahwa, jika Anda menggunakan Control.Invokedari utas latar belakang Anda memperbarui teks / progres / keadaan yang diaktifkan dari kontrol dan tidak peduli jika kontrol sudah dibuang.
Form.Load += Loader()
alih - alih yang lamaForm.Load += new EventHandler(Loader())
Sebenarnya Anda tidak perlu menggunakan kata kunci delegasi. Cukup berikan lambda sebagai parameter:
sumber
sumber
Anda perlu membuat jenis delegasi. Kata kunci 'delegate' dalam pembuatan metode anonim agak menyesatkan. Anda tidak membuat delegasi anonim tetapi metode anonim. Metode yang Anda buat dapat digunakan dalam delegasi. Seperti ini:
sumber
Demi kelengkapan, ini juga dapat dicapai melalui kombinasi metode Action / metode anonim:
sumber
Invoke((Action) Process);
adalah jawaban terbaik, terima kasih!Saya memiliki masalah dengan saran lainnya karena saya terkadang ingin mengembalikan nilai dari metode saya. Jika Anda mencoba menggunakan MethodInvoker dengan nilai pengembalian, sepertinya tidak menyukainya. Jadi solusi yang saya gunakan adalah seperti ini (sangat senang mendengar cara untuk membuat ini lebih ringkas - Saya menggunakan c # .net 2.0):
sumber
Saya suka menggunakan Action sebagai ganti MethodInvoker, lebih pendek dan terlihat lebih bersih.
Misalnya.
sumber
Saya tidak pernah mengerti mengapa ini membuat perbedaan untuk kompiler, tetapi ini sudah cukup.
Bonus: tambahkan beberapa penanganan kesalahan, karena kemungkinan bahwa, jika Anda menggunakan
Control.Invoke
dari utas latar belakang Anda memperbarui teks / progres / keadaan yang diaktifkan dari kontrol dan tidak peduli jika kontrol sudah dibuang.sumber