Berbagi teknologi

Pemrograman asinkron C# Penggunaan dan fungsi Invoke, BeginInvoke, EndInvoke

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Pemrograman asinkron C# Penggunaan dan fungsi Invoke, BeginInvoke, EndInvoke

1. Panggil

Inti dari Invoke hanyalah sebuah metode, dan metode tersebut harus dipanggil melalui suatu objek.

Secara umum, hanya ada dua situasi ketika Invoke benar-benar digunakan:

KontrolPanggilan

DelegasikanPanggilan

Dengan kata lain, Invoke didahului oleh objek kontrol atau delegasi.

KontrolPanggilan

Control's Invoke umumnya digunakan untuk menyelesaikan masalah akses lintas thread. Misalnya, jika Anda ingin mengoperasikan suatu tombol, Anda harus menggunakan button.Invoke. Jika Anda ingin mengoperasikan label teks, Anda harus menggunakan label.Invoke, tetapi semua orang akan merasa sangat merepotkan, jika saya ingin mengoperasikan tombol dan labelnya, bisakah saya menulisnya bersama-sama? Tentu.

Kita tahu bahwa form utama adalah Form, dan Form secara alami mewarisi Kontrol, jadi Form juga memiliki metode Invoke, yang dapat langsung memanggil Form.Invoke. Ini adalah this.Invoke yang umum. Inilah sebabnya mengapa beberapa Pemanggilan tidak memiliki apa pun di depannya. Faktanya, ada ini di depannya, namun dihilangkan.

Contoh:

this.Invoke(new Action(() =>{ button1.Text = "关闭";}));

DelegasikanPanggilan

Invoke Delegasi sebenarnya memanggil metode delegasi dari kumpulan thread untuk dieksekusi. Invoke adalah metode sinkron dan akan memblokir thread UI yang memanggilnya.

  1. void PrintMessage(string message) 
  2.     { 
  3.         Console.WriteLine(message); 
  4.     } 
  5.     MyDelegate myDelegate = PrintMessage; 
  6.     myDelegate.Invoke("Hello, World!"); // 使用 Invoke 方法调用委托引用的方法`

mulai memanggil, akhir memanggil

Kita sudah tahu bahwa async/await, kelas BackGroudWorker dan TPL (Task Parallel Library) ada di C#. Tentu saja, C# masih memiliki beberapa pola lama untuk mendukung pemrograman asinkron.

  1.     delegate long MyDel(int first, int second);
  2.     
  3.     class Program
  4.     {
  5.         static long Sum(int x, int y)
  6.         {
  7.             Console.WriteLine("------Inside Sum@{0}", DateTime.Now.ToString());
  8.             Thread.Sleep(2000);
  9.             return x + y;
  10.         }
  11.     
  12.         static void Main(string[] args)
  13.         {
  14.             MyDel del = new MyDel(Sum);
  15.     
  16.             Console.WriteLine("Before BeginInvoke---@{0}", DateTime.Now.ToString());
  17.             IAsyncResult iar = del.BeginInvoke(3, 5, null, null);
  18.             Console.WriteLine("After BeginInvoke@{0}", DateTime.Now.ToString());
  19.     
  20.             Console.WriteLine("Doing stuff@{0}", DateTime.Now.ToString());
  21.     
  22.             long result = del.EndInvoke(iar);
  23.             Console.WriteLine("End Invoke@{0}", DateTime.Now.ToString());
  24.     
  25.             Console.WriteLine("After EndInvoke:  {0}", result);
  26.     
  27.             Console.ReadKey();
  28.     
  29.         }
  30.     }

Kode di atas mendefinisikan delegasi MyDel, dan meneruskan metode Sum ke objeknya saat dipanggil. Biasanya ketika kita memanggil objek delegasi ini, ia akan memanggil metode yang termasuk dalam daftar panggilannya. Sama seperti pemanggilan suatu metode, hal ini dilakukan secara sinkron.

Tetapi jika objek delegasi hanya memiliki satu metode (metode referensi) dalam daftar panggilan, ia dapat mengeksekusi metode ini secara asinkron. BeginInovke dan EndInvoke digunakan untuk melakukan ini. Kita dapat menggunakannya dengan cara berikut:

* ① Saat kita memanggil metode BeginInvoke, metode referensi akan mulai dijalankan pada thread independen dan segera kembali ke thread asli. Thread asli dapat dilanjutkan, dan metode referensi akan dieksekusi secara paralel di thread yang diinginkan.
* ② Ketika program ingin mendapatkan hasil dari metode asynchronous yang telah selesai, program dapat memeriksa properti IsCompleted dari IAsyncResult yang dikembalikan oleh BeginInvoke, atau memanggil metode EndInvoke dari delegasi untuk menunggu selesainya eksekusi delegasi.

Proses penggunaan di atas mengarah ke tiga mode:

* ①Tunggu hingga selesai. Setelah thread asli memulai metode asinkron dan melakukan beberapa pemrosesan lainnya, thread asli akan menyela dan menunggu metode asinkron selesai sebelum melanjutkan.

* ②Polling, thread asli secara berkala memeriksa apakah thread yang dimulai sudah selesai.

* ③ Thread awal dari callback selalu dieksekusi tanpa menunggu atau memeriksa apakah thread awal telah selesai. Setelah penerbitan referensi di thread awal selesai, thread awal akan memanggil metode callback, dan metode callback akan memproses hasilnya. dari metode asinkron sebelum memanggil EndInvoke.

Situs web referensi:

Penjelasan detail penerapan praktis Invoke dan BeginInvoke di Beranda C#_C# Tutorial_Script

Penggunaan delegasi thread C# BeginInvoke dan EndInvoke_C# Tutorial_Script Home