Другой вариант - полностью отказаться от многопоточности. Если ваша длительная операция может быть разбита на куски, сделайте это в потоке GUI и используйте Application.DoEvents()
, когда вы хотите обновить GUI.
Раньше мне не нравилось использовать этот метод, поскольку он мог не только обновлять графический интерфейс, но и начинать реагировать на пользовательский ввод, запускать таймеры и т. Д., Но в конечном итоге это не менее безопасно, чем использование фонового потока, который позволяет графический интерфейс начать делать что-нибудь в любое время. Поэтому, вероятно, после каждого вызова Application.DoEvents()
вам нужно будет проверить _canceled
или что-то еще. (В конце концов я решил, что мне не нравится существование этого метода, поскольку он исключает гарантии линейного порядка выполнения, чем его использование).
Конечно, вы теряете многоядерную поддержку таким образом, что это повлияет на производительность, если вы попытаетесь запустить много фоновых операций одновременно.