Share via


Control.InvokeRequired Properti

Definisi

Mendapatkan nilai yang menunjukkan apakah pemanggil harus memanggil metode pemanggilan saat melakukan panggilan metode ke kontrol karena pemanggil berada di utas yang berbeda dari yang dibuat kontrol.

public:
 property bool InvokeRequired { bool get(); };
[System.ComponentModel.Browsable(false)]
public bool InvokeRequired { get; }
[<System.ComponentModel.Browsable(false)>]
member this.InvokeRequired : bool
Public ReadOnly Property InvokeRequired As Boolean

Nilai Properti

true jika kontrol Handle dibuat pada utas yang berbeda dari utas panggilan (menunjukkan bahwa Anda harus melakukan panggilan ke kontrol melalui metode pemanggilan); jika tidak, false.

Penerapan

Atribut

Keterangan

Kontrol di Formulir Windows terikat ke utas tertentu dan tidak aman untuk utas. Oleh karena itu, jika Anda memanggil metode kontrol dari utas yang berbeda, Anda harus menggunakan salah satu metode pemanggilan kontrol untuk marshal panggilan ke utas yang tepat. Properti ini dapat digunakan untuk menentukan apakah Anda harus memanggil metode pemanggilan, yang dapat berguna jika Anda tidak tahu utas apa yang memiliki kontrol.

Catatan

Selain InvokeRequired properti , ada empat metode pada kontrol yang aman untuk dipanggil utas: Invoke,BeginInvoke, EndInvoke dan CreateGraphics jika handel untuk kontrol telah dibuat. Memanggil CreateGraphics sebelum handel kontrol dibuat pada utas latar belakang dapat menyebabkan panggilan lintas utas ilegal. Untuk semua panggilan metode lainnya, Anda harus menggunakan salah satu metode pemanggilan ini saat memanggil dari utas yang berbeda.

Jika handel kontrol belum ada, InvokeRequired cari rantai induk kontrol hingga menemukan kontrol atau formulir yang memang memiliki handel jendela. Jika tidak ada handel yang sesuai yang dapat ditemukan, InvokeRequired metode akan mengembalikan false.

Ini berarti bahwa InvokeRequired dapat mengembalikan false jika Invoke tidak diperlukan (panggilan terjadi pada utas yang sama), atau jika kontrol dibuat pada utas yang berbeda tetapi handel kontrol belum dibuat.

Dalam kasus di mana handel kontrol belum dibuat, Anda tidak boleh hanya memanggil properti, metode, atau peristiwa pada kontrol. Ini dapat menyebabkan handel kontrol dibuat pada utas latar belakang, mengisolasi kontrol pada utas tanpa pompa pesan dan membuat aplikasi tidak stabil.

Anda dapat melindungi dari kasus ini dengan juga memeriksa nilai IsHandleCreated saat InvokeRequired kembali pada utas false latar belakang. Jika handel kontrol belum dibuat, Anda harus menunggu hingga dibuat sebelum memanggil Invoke atau BeginInvoke. Biasanya, ini hanya terjadi jika utas latar belakang dibuat di konstruktor formulir utama untuk aplikasi (seperti dalam Application.Run(new MainForm()), sebelum formulir telah ditampilkan atau Application.Run telah dipanggil.

Salah satu solusinya adalah menunggu hingga handel formulir dibuat sebelum memulai utas latar belakang. Paksa menangani pembuatan dengan memanggil Handle properti , atau tunggu hingga Load peristiwa memulai proses latar belakang.

Solusi yang lebih baik adalah menggunakan yang SynchronizationContext dikembalikan daripada SynchronizationContext kontrol untuk marshaling lintas utas.

Catatan

Pengecualian mungkin dilemparkan jika utas yang seharusnya memproses pesan tidak lagi aktif.

Untuk informasi selengkapnya tentang kontrol Formulir Windows multithreaded, lihat Cara: Menggunakan Utas Latar Belakang untuk Mencari File dan Cara: Melakukan Panggilan Thread-Safe ke Kontrol Formulir Windows.

Berlaku untuk

Lihat juga