Desidero scrivere il mio controllo personale, quando viene richiamato il ctor, viene visualizzato un MessageBox.WinRT - MessageDialog.ShowAsync genererà UnauthorizedAccessException nella mia classe personalizzata
public class Class1
{
public Class1()
{
ShowDialog();
}
void ShowDialog()
{
SynchronizationContext context = SynchronizationContext.Current;
if (context != null)
{
context.Post((f) =>
{
MessageDialog dialog = new MessageDialog("Hello!");
dialog.ShowAsync();
}, null);
}
}
}
Se la mia classe è utilizzata da qualcuno, e scrivere i codici come sotto, UnauthorizedAccessException è sempre gettato in dialog.ShowAsync();
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
ClassLibrary1.Class1 c1 = new ClassLibrary1.Class1();
MessageDialog dialog1 = new MessageDialog("");
dialog1.ShowAsync();
}
C'è un modo per mostrare un messaggio di dialogo senza eccezione?
Ho trovato un modo, divertiti!
Task ShowDialog()
{
CoreDispatcher dispatcher = Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher;
Func<object, Task<bool>> action = null;
action = async (o) =>
{
try
{
if (dispatcher.HasThreadAccess)
await new MessageDialog("Hello!").ShowAsync();
else
{
dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() => action(o));
}
return true;
}
catch (UnauthorizedAccessException)
{
if (action != null)
{
Task.Delay(500).ContinueWith(async t => await action(o));
}
}
return false;
};
return action(null);
}
Beh, è doloroso. Non è possibile mostrare una finestra di messaggio quando l'interfaccia utente ne mostra già una. Questo deve essere intrecciato, molto difficile da fare, naturalmente. Nessuna vera cura, ma evitare che i thread di lavoro spingano da soli le scatole. –
Ho trovato un modo, basta modificare il metodo ShowDialog come soluzione alternativa – glover
Beh, non è una soluzione reale. Cosa succede al codice che non hai scritto chiama Call ShowAsync(). Ancora un kaboom. –