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