Ответ 1
В соответствии с их Best Practices:
Gtk # не является потокобезопасным инструментарием, а это означает, что только один поток за раз может безопасно вызывать методы на Gtk #. Этот поток, как правило, представляет собой поток, выполняющий основной цикл (т.е. когда управление явно передано в Gtk).
Когда разработчикам приложений необходимо, чтобы потоки обновили некоторый элемент графического интерфейса пользователя, им нужно либо получить блокировку, которая позволяет им выдавать вызовы инструментальных средств Gtk #, либо они могут сделать свой код выполненным в том же потоке, что и один поток, который выполняет основной цикл.
Чтобы вызвать метод в потоке основного цикла GTK + и избежать любых проблем с потоками с помощью GTK, вы можете использовать метод Gtk.Application.Invoke() (если вы нацеливаете Gtk # 1.0, вы можете использовать Gtk.ThreadNotify).
Приведен следующий пример; вы должны использовать Invoke
для выполнения любого кода Gtk из основного цикла:
public void ThreadedMethod()
{
Gtk.Application.Invoke(delegate {
do_stuff_in_main_thread();
});
}