Когда вы используете winforms и используете синхронизирующий текст, вызов будет перенаправлен в поток GUI.
для вашего конкретного случая, я думаю, что-то вроде этого должно сработать, возможно, будет хорошей идеей создать класс, представляющий Command
public class CommandManager
{
private readonly SynchronizationContex _synchronizationContex;
public CommandManager(SynchronizationContext synchronizationContex)
{
_synchronizationContex = synchronizationContex;
}
public void ExecuteAsync(Func<State> action, Action<State> callback)
{
ThreadPool.QueueUserWorkItem(o => {
state = action();
_synchronizationContex.Send(oo => callback(state));
});
}
}
, который вы создадите следующим образом.(в потоке GUI, например, в основной форме)
var commandManager = new CommandManager(SynchronizationContext.Current);
вы бы использовали его так:
commandManager.ExecuteAsync(() => new State() { Success = true },
c => MessageBox.Show("success in the GUI thread"));