Teknologian jakaminen

C# asynkroninen ohjelmointi Invoke, beginInvoke, endInvoke käyttö ja toiminta

2024-07-12

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

C# asynkroninen ohjelmointi Invoke, beginInvoke, endInvoke käyttö ja toiminta

1. Kutsu

Invoken olemus on vain menetelmä, ja metodia on kutsuttava objektin kautta.

Yleisesti ottaen Invokea todella käytetään vain kahdessa tilanteessa:

ControlInvoke

DelegateInvoke

Toisin sanoen Invokea edeltää joko ohjausobjekti tai delegoitu objekti.

ControlInvoke

Control's Invokea käytetään yleensä poikkisäikeisiin pääsyyn liittyvien ongelmien ratkaisemiseen. Jos esimerkiksi haluat käyttää painiketta, sinun on käytettävä painiketta. Invoke Jos haluat käyttää tekstitunnistetta, sinun on käytettävä etikettiä kaikki pitävät sitä erittäin hankalana , jos haluan käyttää sekä painiketta että etikettiä, voinko kirjoittaa ne yhteen? varma.

Tiedämme, että päälomake on Form ja Form luonnollisesti perii Controlin, joten Formilla on myös Invoke-menetelmä, joka voi kutsua suoraan Form.Invokea. Tämä on meidän yhteinen this.Invoke. Tästä syystä joillakin Invokeilla ei ole mitään edessään. Itse asiassa tämä on heidän edessään, mutta se on jätetty pois.

Esimerkki:

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

DelegateInvoke

Delegate's Invoke itse asiassa kutsuu delegate-metodin säievalikoimasta suorittamista varten. Invoke on synkroninen menetelmä ja estää sitä kutsuvan käyttöliittymän säikeen.

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

beginInvoke, endInvoke

Tiedämme jo, että async/await, BackGroudWorker-luokka ja TPL (Task Parallel Library) ovat olemassa C#:ssa. Tietysti C#:ssa on vielä joitain vanhoja malleja tukemaan asynkronista ohjelmointia.

  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.     }

Yllä oleva koodi määrittää delegoidun MyDelin ja välittää Sum-metodin objektilleen, kun sitä kutsutaan. Normaalisti kun kutsumme tätä delegaattiobjektia, se kutsuu kutsuluettelossaan olevia menetelmiä. Aivan kuten menetelmän kutsuminen, tämä tapahtuu synkronisesti.

Mutta jos delegate-objektilla on vain yksi menetelmä (viitemenetelmä) puheluluettelossa, se voi suorittaa tämän menetelmän asynkronisesti. Tähän käytetään BeginInovkea ja EndInvokea. Voimme käyttää sitä seuraavalla tavalla:

* ① Kun kutsumme BeginInvoke-menetelmää, se aloittaa viitemenetelmän suorittamisen itsenäisessä säikeessä ja palaa välittömästi alkuperäiseen säikeeseen. Alkuperäinen säie voi jatkua, ja vertailumenetelmä suoritetaan rinnakkain halutussa säikeessä.
* ② Kun ohjelma haluaa saada valmiin asynkronisen menetelmän tuloksen, se voi tarkistaa BeginInvoken palauttaman IAsyncResult-ominaisuuden IsCompleted tai kutsua edustajan EndInvoke-metodia odottamaan delegaation suorittamisen valmistumista.

Yllä oleva käyttöprosessi johtaa kolmeen tilaan:

* ①Odota valmistumiseen Kun alkuperäinen säie aloittaa asynkronisen menetelmän ja suorittaa jonkin muun käsittelyn, alkuperäinen säie keskeyttää ja odottaa asynkronisen menetelmän valmistumista ennen jatkamista.

* ② Pollaus, alkuperäinen säiettä tarkistaa säännöllisesti, onko aloitettu säie valmis. Jos ei, se voi jatkaa muiden asioiden tekemistä.

* ③ Takaisinkutsun alkuperäinen säie suoritetaan aina odottamatta tai tarkistamatta, onko aloitussäie valmis. Kun aloitussäikeen viite on suoritettu, aloitussäie kutsuu takaisinsoittomenetelmän ja takaisinsoittomenetelmä käsittelee tuloksen. asynkronisesta menetelmästä ennen EndInvoken kutsumista.

Viitesivusto:

Yksityiskohtainen selitys Invoken ja BeginInvoken käytännön soveltamisesta C#_C# Tutorial_Script Home

C#-säikeen edustajan BeginInvoke ja EndInvoke_C# Tutorial_Script Home käyttö