Lightswitch C# MessageBoxResult 错误(UnautherizedAccessException:无效的跨线程访问)
Lightswitch C# MessageBoxResult Error (UnautherizedAccessException : Invalid Cross-Thread Access)
我正在慢慢开始将 Lightswitch 用于我们拥有的一些小程序项目,但我遇到了一个问题,我已经查看了几篇帖子和日志,目前还没有找到解决方案。如有任何帮助,我们将不胜感激。
作为注释;我正在使用 Visual Studio 2013 Ultimate。
我遇到的错误是 UnauthorizedAccessException was unhandled by user code
。
我遇到问题的代码段粘贴在下方,用户单击按钮时也会调用该段。这将用于捕获用户选择“确定”或“取消”,并根据用户的选择执行单独的操作。
public void Restart_Prompt()
{
MessageBoxResult result = MessageBox.Show("Yippy", "Hello", MessageBoxButton.OKCancel);
if (result == MessageBoxResult.OK)
{
MessageBox.Show("Selected option was Ok");
}
else
{
MessageBox.Show("Selected option was Cancel...");
}
}
再次强调,如有任何关于此问题的指点或帮助,我们将不胜感激。
如果有人感兴趣,这里是错误的详细文本:
{System.UnauthorizedAccessException: Invalid cross-thread access.
at MS.Internal.XcpImports.CheckThread()
at MS.Internal.XcpImports.MessageBox_ShowCore(Window window, String messageBoxText, String caption, UInt32 type)
at System.Windows.MessageBox.ShowCore(Window window, String messageBoxText, String caption, MessageBoxButton button)
at System.Windows.MessageBox.Show(String messageBoxText, String caption, MessageBoxButton button)
at LightSwitchApplication.INVENTORiesListDetail.Restart_Prompt()
at LightSwitchApplication.INVENTORiesListDetail.Restart_ASI_Execute()
at LightSwitchApplication.INVENTORiesListDetail.DetailsClass.MethodSetProperties._Restart_ASI_InvokeMethod(DetailsClass d, ReadOnlyCollection`1 args)
at Microsoft.LightSwitch.Details.Framework.Internal.BusinessMethodImplementation`2.<TryInvokeMethod>b__5()
at Microsoft.LightSwitch.Utilities.Internal.UserCodeHelper.CallUserCode(Type sourceType, String methodName, String instance, String operation, ILoggingContext context, Action action, String additionalText, Func`1 getCompletedMessage, Boolean tryHandleException, Boolean swallowException, Exception& exception)}
在 .Net - WPF 和 WinForms 中 - UI 是线程仿射的。换句话说,与 UI 的所有交互都必须在 UI 线程上发生。在 WPF 中,这是通过 Dispatcher 类型实现的,而在 WinForms 中,这是通过每个控件上的 Invoke 方法实现的。您的方法是从后台线程调用的,因此您需要将调用编组到 UI 线程以防止错误。在电灯开关中我认为是这样的:
Dispatchers.Main.BeginInvoke(()=>
{
// message box method call here
});
我正在慢慢开始将 Lightswitch 用于我们拥有的一些小程序项目,但我遇到了一个问题,我已经查看了几篇帖子和日志,目前还没有找到解决方案。如有任何帮助,我们将不胜感激。
作为注释;我正在使用 Visual Studio 2013 Ultimate。
我遇到的错误是 UnauthorizedAccessException was unhandled by user code
。
我遇到问题的代码段粘贴在下方,用户单击按钮时也会调用该段。这将用于捕获用户选择“确定”或“取消”,并根据用户的选择执行单独的操作。
public void Restart_Prompt()
{
MessageBoxResult result = MessageBox.Show("Yippy", "Hello", MessageBoxButton.OKCancel);
if (result == MessageBoxResult.OK)
{
MessageBox.Show("Selected option was Ok");
}
else
{
MessageBox.Show("Selected option was Cancel...");
}
}
再次强调,如有任何关于此问题的指点或帮助,我们将不胜感激。
如果有人感兴趣,这里是错误的详细文本:
{System.UnauthorizedAccessException: Invalid cross-thread access.
at MS.Internal.XcpImports.CheckThread()
at MS.Internal.XcpImports.MessageBox_ShowCore(Window window, String messageBoxText, String caption, UInt32 type)
at System.Windows.MessageBox.ShowCore(Window window, String messageBoxText, String caption, MessageBoxButton button)
at System.Windows.MessageBox.Show(String messageBoxText, String caption, MessageBoxButton button)
at LightSwitchApplication.INVENTORiesListDetail.Restart_Prompt()
at LightSwitchApplication.INVENTORiesListDetail.Restart_ASI_Execute()
at LightSwitchApplication.INVENTORiesListDetail.DetailsClass.MethodSetProperties._Restart_ASI_InvokeMethod(DetailsClass d, ReadOnlyCollection`1 args)
at Microsoft.LightSwitch.Details.Framework.Internal.BusinessMethodImplementation`2.<TryInvokeMethod>b__5()
at Microsoft.LightSwitch.Utilities.Internal.UserCodeHelper.CallUserCode(Type sourceType, String methodName, String instance, String operation, ILoggingContext context, Action action, String additionalText, Func`1 getCompletedMessage, Boolean tryHandleException, Boolean swallowException, Exception& exception)}
在 .Net - WPF 和 WinForms 中 - UI 是线程仿射的。换句话说,与 UI 的所有交互都必须在 UI 线程上发生。在 WPF 中,这是通过 Dispatcher 类型实现的,而在 WinForms 中,这是通过每个控件上的 Invoke 方法实现的。您的方法是从后台线程调用的,因此您需要将调用编组到 UI 线程以防止错误。在电灯开关中我认为是这样的:
Dispatchers.Main.BeginInvoke(()=>
{
// message box method call here
});