Вызовите и BeginInvoke

Поздравления, я разрабатываю некоторое приложение в C#. В данный момент я имею дело с поточной обработкой, и у меня есть вопрос, который я знаю. Каково различие между, Вызывают и BeginInvoke? Я считал некоторый поток, и я нашел немного полезной информации здесь: здесь

Однако что является различием между, Вызывают и BeginInvoke в следующем коде:

private void ProcessRoutine()
{
   for (int nValue = StartFrom; nValue <= EndTo; nValue++)
   {
      this.Invoke(this.MyDelegate, nValue);
      //this.BeginInvoke(this.MyDelegate, nValue);
   }
   MessageBox.Show("Counting complete!");
}
private void MessageHandler(int progress)
{
    lblStatus.Text = lblStatus.Text = "Processing item: " + progress.ToString();
    progressBar1.Value = progress;
}

где MyDelegate является ссылкой на функцию MessageHandler.

Я заметил тот BeginInvoke lblStatus использования. Текст не обновляется, где использование Вызывает, обновляет маркировку. Дополнительно я знаю, что Вызывают, ожидает его выполнения для завершения. Самый важный случай, которым я интересуюсь, - то, почему существует различие в обновлении текста метки в этом случае.

17
задан Community 23 May 2017 в 12:10
поделиться

5 ответов

С Invoke метод запускается, и приложение ожидает его завершения.

С BeginInvoke метод вызывается асинхронно, и приложение продолжает выполняться, пока выполняется метод, указанный в BeginInvoke.

С BeginInvoke вам нужно вызвать EndInvoke, чтобы получить результаты метода, который вы выполнили с помощью BeginIvnoke.

Вы не должны обновлять компоненты графического интерфейса в методах BeginXXX, поскольку они выполняются в другом потоке к потоку графического интерфейса, в отличие от вашего метода Invoke. Вы не можете получить доступ к компонентам GUI в потоке, отличном от потока GUI.

Надеюсь, это поможет!

8
ответ дан 30 November 2019 в 12:13
поделиться

To begin, from your link:

  • Control.Invoke: Executes on the UI thread, but calling thread waits for completion before continuing.
  • Control.BeginInvoke: Executes on the asynchronous UI thread, and calling thread doesn't wait for completion.

and from MSDN:

BeginInvoke executes the specified delegate asynchronously on the thread that the control's underlying handle was created on.

To sum it up, BeginInvoke is asynchronous. When BeginInvoke is called from the UI thread the request will be executed in parallel with the UI thread. Which means it may not execute until after the currently executing method has returned. So in this case the text box will never appear to update because the for loop will not be interrupted, as the calling thread will not wait for this event to be completed before continuing.

Alternatively, Invoke is synchronous. The text box will be updated because the calling thread will wait for the call to complete before continuing execution.

19
ответ дан 30 November 2019 в 12:13
поделиться

BeginInvoke выполняет тело метода в другом потоке и позволяет текущему потоку продолжить. Если вы пытаетесь напрямую обновить свойство элемента управления из другого потока, это вызовет исключение.

1
ответ дан 30 November 2019 в 12:13
поделиться

Это в основном сводится к тому, хотите ли вы, чтобы элемент управления обновлялся синхронно или асинхронно. Все зависит от вашей конкретной ситуации.

0
ответ дан 30 November 2019 в 12:13
поделиться

Здесь нет «правильных», только предпочтения.

Sun является последовательным в том, как они называют классы, содержащие «URL» и «HTML», но я вижу HTTP с использованием всех кэпов и верблюжьего регистра в javadocs.

Лично я бы предпочел DVD-проигрыватель.

-121--616890-

Когда я это сделал, я никогда фактически не устанавливал HTC Sync.I использовал AVD Manager для установки драйвера USB и следовал следующим инструкциям

-121--3260469-

Control. BeginInvoke BeginInvoke делает. Одна строка MSDN говорит:

Выполняет указанный делегат асинхронно на потоке, который базовым дескриптором элемента управления был создан на.

Однако Control.BeginInvoke просто использует PostMessage и возвращает - поток CLR не создается.

Функция PostMessage (разносит) сообщение в очереди сообщений связан с потоком, который создал указанное окно и возвращает без ожидания потока для обработки сообщения.

В этой статье кратко описывается, следует ли использовать Invoke или BeginInvoke :

Какую функцию использовать, спросите. Это действительно зависит от ваших требований. Если вы хотите завершить обновление пользовательского интерфейса прежде чем продолжить, используйте команду Вызвать (Invoke). Если такого требования нет, я бы предложить использовать BeginInvoke в том виде, в каком он поток, называющий его, казалось бы, «быстрее.» Есть несколько готчей с BeginInvoke.

  • Если вызываемая функция через BeginInvoke обращается к общему состоянию (состояние, совместно используемое потоком пользовательского интерфейса и другие потоки), вы находитесь в проблемы. Состояние может измениться между звонками BeginInvoke и при переносе функция фактически выполняется, что приводит к трудно найти проблемы с хронометражем.
  • При передаче ссылочных параметров функции, вызываемой через BeginInvoke, убедитесь, что что никто больше не изменяет переданный перед завершением функции. Обычно люди клонируют объект перед передачей BeginInvoke, что позволяет полностью избежать этой проблемы.
5
ответ дан 30 November 2019 в 12:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: