Предполагается, что метод QueryToExcel()
ставит в очередь работу, выполняемую в пуле потоков, чтобы позволить потоку пользовательского интерфейса продолжать свою собственную работу без зависания.
Но вы заметили, что пользовательский интерфейс все равно зависает, говоря:
даже при вызове моего пользовательского интерфейса замораживается
Он вызывает поток пользовательского интерфейса из другого потока, который его замораживает.
Работа в другом потоке заключается в том, чтобы не использовать поток пользовательского интерфейса.Если мы возвращаем поток пользовательского интерфейса из рабочего потока, эффект теряется (или частично теряется, что раздражает в любом случае).
Вы также используете Invoke () вместо BeginInvoke () .Последний выполняется асинхронно: он немедленно возвращается и может предотвратить взаимные блокировки, если вызванный элемент управления занят, или иным образом недоступен / не отвечает.
В любом случае, это не предотвратит заикание пользовательского интерфейса.
Глядя на код, который вы здесь представили, кажется, что нет необходимости вообще вызывать поток пользовательского интерфейса: вторичному потоку просто нужны значения свойств некоторых элементов управления, а затем назначается DataTable для поля.
Затем можно передать этому методу требуемые значения в качестве аргументов, присваивая свойства Controls некоторым переменным или свойствам класса (чтобы было легче понять, что содержат аргументы).
рабочий метод может быть изменен в
private DataTable QueryToExcel(string[] paramArray)
Or
private DataTable QueryToExcel(SomeClass values)
и может вызываться как:
private async void updateButton_Click(object sender, EventArgs e)
{
var dt = await Task.Run(() => QueryToExcel(values));
Or
dataGridView1.DataSource = await Task.Run(() => QueryToExcel(values));
}
В QueryToExcel()
в Excel:
- Доступ к параметру
values
для настройки запроса или другой обработки. - Создайте соединение с БД и заполните DataTable / DataSet.
- Утилизировать все созданные одноразовые объекты (Connection / DataAdapter и т. Д.)
- Возвращать таблицу данных