में अनधिकृत एक्सेस अपवाद फेंक देगा, जब मैं ctor आह्वान करता हूं, तो अपना नियंत्रण लिखना चाहता हूं, एक संदेशबॉक्स दिखाया जाता है।WinRT - MessageDialog.ShowAsync मेरी कस्टम क्लास
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);
}
}
}
मेरी कक्षा किसी के द्वारा प्रयोग किया जाता है, और नीचे के रूप में कोड लिखते हैं, UnauthorizedAccessException हमेशा dialog.ShowAsync();
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
ClassLibrary1.Class1 c1 = new ClassLibrary1.Class1();
MessageDialog dialog1 = new MessageDialog("");
dialog1.ShowAsync();
}
में फेंक दिया जाता है वहाँ बिना किसी अपवाद के संदेश संवाद दिखाने के लिए एक तरीका है?
मुझे एक रास्ता मिला, इसका आनंद लें!
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);
}
अच्छा, यह दर्दनाक है। यूआई पहले से ही एक दिखा रहा है जब आप एक संदेश बॉक्स नहीं दिखा सकते हैं। यह निश्चित रूप से करने के लिए बहुत मुश्किल है, interlocked करने की जरूरत है। कोई वास्तविक इलाज नहीं है लेकिन कार्यकर्ता धागे से खुद को धक्का देने से बचें। –
मुझे एक तरीका मिल गया है, केवल ShowDialog विधि को वर्कअराउंड – glover
के रूप में संशोधित करें, ठीक है, यह वास्तविक फ़िक्स नहीं है। कोड के साथ क्या होता है जिसे आपने नहीं लिखा था जो ShowAsync() को कॉल करता है। अभी भी एक कबूतर –