К сожалению, Application.Invoke()
является асинхронным:
private string ThreadFunction(int i)
{
string result = null;
Gtk.Application.Invoke(delegate
{
OutputStringToUserInterface("i = " + i.ToString());
result = GetStringFromUserInterface();
});
return result;
}
Это означает, что в этом примере ThreadFunction()
продолжается сразу после вызова Application.Invoke()
, что приводит к возможно неопределенному состоянию строки result
. - Обычно ThreadFunction()
будет быстрее и вернется со старым значением (т. Е. null
).
Это обходной путь, использующий ManualResetEvent
для синхронизации Application.Invoke()
:
private string ThreadFunction(int i)
{
string result = null;
using (var ev = new ManualResetEvent(false))
{
Gtk.Application.Invoke(delegate
{
OutputStringToUserInterface("i = " + i.ToString());
result = GetStringFromUserInterface();
ev.Set();
});
ev.WaitOne();
}
return result;
}
Таким образом, ThreadFunction()
ждет, пока не вернется Application.Invoke()
, как это было бы с использованием WinForms Control.Invoke () .
РЕДАКТИРОВАТЬ: Лучший пример кода
EDIT2: Добавить пропущенный using
Теперь мой вопрос: Есть ли лучшее решение?