Использование асинхронного программирования может быть полезно для улучшения работы пользователя. Асинхронное программирование в основном включает обработку тяжелой операции в отдельный поток, чтобы избежать замораживания пользовательского интерфейса и позволить пользователю выполнять другие операции параллельно.
В приложении windows всякий раз, когда вы пытаетесь получить доступ к объекту windows forms или элементов управления из другого потока, то вы не сможете этого сделать. Чтобы обработать такой вид сценария, можно использовать Invoke для доступа к объекту перекрестного потока
Предположим, что у вас есть функция в вашей форме, которую вы хотите вызвать из отдельного потока.
1 2 3 4 |
private void UpdateStatus(string statusText) { // Body of the function } |
Прежде всего вам нужно создать делегат с соответствующей сигнатурой этой функции
1 |
delegate void UpdateStatusInvoker(string statusText) |
Теперь для вызова этой функции из отдельного потока используйте метод Invoke с параметрами
1 |
this.Invoke(new UpdateStatusInvoker(UpdateStatus), "Status text"); |
Если вы не уверены, будет ли он вызван из другого потока, вы можете проверить, является ли invoke обязательным.
1 2 3 4 5 6 7 8 |
if (this.InvokeRequired) { this.Invoke(new UpdateStatusInvoker(UpdateStatus), "Status text"); } else { UpdateStatus("Status text"); } |