Приветствую.
Для синхронизации потоков и UI выбрал следующее:
public void Invoke(MethodInvoker methodToInvoke)
{
if (Disposing || IsDisposed) return;
if (InvokeRequired)
{
BeginInvoke(methodToInvoke);
}
else
{
methodToInvoke();
}
}
private void RefreshUI()
{
Invoke(delegate
{
// взаимодействие UI
});
}
Использую BeginInvoke, потому что на Invoke процесс зависал при закрытии формы. Подсказку нашёл там:
http://rsdn.org/forum/dotnet.gui/1869795.flat#1869795Автор: busybox
Дата: 27.04.06
, поэтому и тему так назвал.
Но сейчас возникла необходимость возвращать данные из UI.
Сделал так:
public object InvokeReturn(Func<object> methodToInvoke)
{
if (Disposing || IsDisposed) return null;
if (InvokeRequired)
{
var result = BeginInvoke(methodToInvoke);
var ret = EndInvoke(result);
return ret;
}
else
{
return methodToInvoke();
}
}
private object ReturnObject()
{
return (object)InvokeReturn(delegate
{
return (object)uiControl.Text;
});
}
И теперь опять при закрытии формы зависаю на EndInvoke. Что не так?