minhas informações de contato
Correspondência[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
A essência do Invoke é apenas um método, e o método deve ser chamado por meio de um objeto.
De modo geral, existem apenas duas situações em que Invoke é realmente usado:
ControlInvoke
DelegarInvoke
Em outras palavras, Invoke é precedido por um objeto de controle ou delegado.
O Invoke do controle geralmente é usado para resolver problemas de acesso entre threads. Por exemplo, se você deseja operar um botão, você deve usar button.Invoke. Se você deseja operar um rótulo de texto, você deve usar label.Invoke, mas. todos acharão isso muito problemático. Se eu quiser operar o botão e o rótulo, posso escrevê-los juntos? claro.
Sabemos que o formulário principal é um Form, e o Form herda naturalmente o Control, então o Form também possui o método Invoke, que pode chamar diretamente Form.Invoke Este é o nosso this.Invoke comum. É por isso que alguns Invokes não têm nada na frente deles. Na verdade, existe isso na frente deles, mas é omitido.
Exemplo:
this.Invoke(new Action(() =>{ button1.Text = "关闭";}));
O Invoke do delegado, na verdade, chama o método delegado do pool de threads para execução. Invoke é um método síncrono e bloqueará o thread da UI que o chama.
- void PrintMessage(string message)
- {
- Console.WriteLine(message);
- }
- MyDelegate myDelegate = PrintMessage;
- myDelegate.Invoke("Hello, World!"); // 使用 Invoke 方法调用委托引用的方法`
Já sabemos que async/await, classe BackGroudWorker e TPL (Task Parallel Library) existem em C#. É claro que o C# ainda possui alguns padrões antigos para oferecer suporte à programação assíncrona.
- delegate long MyDel(int first, int second);
-
- class Program
- {
- static long Sum(int x, int y)
- {
- Console.WriteLine("------Inside Sum@{0}", DateTime.Now.ToString());
- Thread.Sleep(2000);
- return x + y;
- }
-
- static void Main(string[] args)
- {
- MyDel del = new MyDel(Sum);
-
- Console.WriteLine("Before BeginInvoke---@{0}", DateTime.Now.ToString());
- IAsyncResult iar = del.BeginInvoke(3, 5, null, null);
- Console.WriteLine("After BeginInvoke@{0}", DateTime.Now.ToString());
-
- Console.WriteLine("Doing stuff@{0}", DateTime.Now.ToString());
-
- long result = del.EndInvoke(iar);
- Console.WriteLine("End Invoke@{0}", DateTime.Now.ToString());
-
- Console.WriteLine("After EndInvoke: {0}", result);
-
- Console.ReadKey();
-
- }
- }
O código acima define um delegado MyDel e passa o método Sum para seu objeto quando chamado. Normalmente quando chamamos este objeto delegado, ele chamará os métodos incluídos em sua lista de chamadas. Assim como chamar um método, isso é feito de forma síncrona.
Mas se o objeto delegado tiver apenas um método (método de referência) na lista de chamadas, ele poderá executar esse método de forma assíncrona. BeginInovke e EndInvoke são usados para fazer isso. Podemos usá-lo da seguinte maneira:
* ① Quando chamamos o método BeginInvoke, ele começa a executar o método de referência em um thread independente e retorna imediatamente ao thread original. O thread original pode continuar e o método de referência será executado em paralelo no thread desejado.
* ② Quando o programa deseja obter o resultado do método assíncrono concluído, ele pode verificar a propriedade IsCompleted do IAsyncResult retornado por BeginInvoke ou chamar o método EndInvoke do delegado para aguardar a conclusão da execução do delegado.
O processo de uso acima leva a três modos:
* ①Aguarde até a conclusão Depois que o thread original inicia o método assíncrono e faz algum outro processamento, o thread original interrompe e aguarda a conclusão do método assíncrono antes de continuar.
* ②Polling, o thread original verifica regularmente se o thread iniciado foi concluído. Caso contrário, ele pode continuar a fazer outras coisas.
* ③ O encadeamento original do retorno de chamada é sempre executado sem esperar ou verificar se o encadeamento inicial foi concluído. Depois que a emissão de referência no encadeamento inicial for concluída, o encadeamento inicial chamará o método de retorno de chamada e o método de retorno de chamada processará o resultado. do método assíncrono antes de chamar EndInvoke.
Explicação detalhada da aplicação prática de Invoke e BeginInvoke em C#_C# Tutorial_Script Home
Uso do delegado de thread C# BeginInvoke e EndInvoke_C# Tutorial_Script Home