Вы можете просто запустить длительную операцию в Dispatcher.BeginInvoke:
private void OnSomeContextMenuCommand(object sender, EventArgs e)
{
Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
{
// Put long-running operation here
}));
}
Если вы сделаете это, ContextMenu закроется, прежде чем начнется ваша длительная операция.
В целом, я предпочитаю, чтобы это решение явно закрывало ContextMenu, потому что оно полностью отделяет пользовательский интерфейс от обработки команд.