Если вы хотите, чтобы вызов Dispatcher блокировался (ожидание возврата), я бы использовал Invoke вместо BeginInvoke. Это имитировало бы больше поведения фактического вызова функции напрямую. Вызывать блокирование вызывающего потока до тех пор, пока функция не будет завершена (больше похоже на Win32 SendMessage). BeginInvoke просто отправляет сообщения и возвращает их, не дожидаясь возврата функции (как сообщение Win32 PostMessage).
CheckAccess идет медленно. Я бы ограничил CheckAccess, сделав звонки менее разговорчивыми в разных темах.
public delegate bool MyFuncHandler(object arg);
bool ThreadedMyFunc(object arg)
{
//...
bool result;
//...
// use dispatcher passed in, I would pass into the contructor of your class
if (dispatcher.CheckAccess())
{
result = MyFunc(arg);
}
else
{
result = dispatcher.Invoke(new MyFuncHandler(MyFunc), arg);
}
return result;
}
bool MyFunc(object arg)
{
//...
}