Applies To: Silverlight & XNA (anyone using Launchers / Choosers)
[some launcher object].Show() with a
try/catch block which catches
InvalidOperationException, since running
Show() while navigating (for example, if the user clicks your button multiple times quickly in succession) will cause this Exception to be thrown.
You have a button that says “Purchase Me” which launches the Marketplace or one that says “Send Feedback” which launches Outlook to send an email. For example:
EmailComposeTask emailComposeTask = new EmailComposeTask(); emailComposeTask.To = "firstname.lastname@example.org"; emailComposeTask.Subject = "Feedback for AwesomeApp"; emailComposeTask.Show();
The user hits the button multiple times, quickly. The app crashes.
If you debug this you’ll find that you can’t reproduce this behaviour on the Emulator (at least, I couldn’t) but that it reproduces pretty consistently on the phone.
On the phone you’ll get an
InvalidOperationException with the following message:
Navigation is not allowed when the task is not in the foreground. Error: -2147220989
There are a couple of solutions – you could remember your state, so that if you clicked the button once and haven’t navigated back yet then you just don’t call
Show(). Alternatively you could check if you were currently Navigating, and not call
Show(). I personally prefer to wrap the statement in a
try/catch block since it’s the easiest to have to worry about and the cost for the
try/catch block is minimal (performance wise).