C# 在线程上显示忙指示器并启动应用程序:线程错误(调用线程无法访问此对象)
我正在开发一个WPF应用程序,并遵循MVVM方法。当用户单击“输入”按钮时,我必须在我的登录屏幕上显示忙指示灯。在“回车”按钮上,我有一个名为“EnterCommand”的ICommand,它会检查身份验证,然后加载主窗口C# 在线程上显示忙指示器并启动应用程序:线程错误(调用线程无法访问此对象),c#,.net,wpf,C#,.net,Wpf,我正在开发一个WPF应用程序,并遵循MVVM方法。当用户单击“输入”按钮时,我必须在我的登录屏幕上显示忙指示灯。在“回车”按钮上,我有一个名为“EnterCommand”的ICommand,它会检查身份验证,然后加载主窗口 private ICommand _EnterCommand; public ICommand EnterCommand { get { return _EnterCommand ?? (_EnterCommand = new Delegate
private ICommand _EnterCommand;
public ICommand EnterCommand
{
get
{
return _EnterCommand ?? (_EnterCommand = new DelegateCommand(() =>
{
Thread objThread = new Thread(LoadApplication);
objThread.SetApartmentState(ApartmentState.STA);
objThread.Start();
}));
}
}
IsBusy属性已绑定到此showprogress
private bool _ShowProgress = false;
public bool ShowProgress
{
get { return _ShowProgress; }
set
{
if (_ShowProgress != value)
{
_ShowProgress = value;
FirePropertyChanged("ShowProgress");
}
}
}
我正在这个命令上创建一个线程,然后从(bool属性名称:ShowProgress)MVVM设置IsBusy属性
在LoadApplication中:
public void LoadApplication()
{
ShowProgress= true;
if (AuthenticateUser)
{
MainWindow objMainWindow = new MainWindow();
objMainWindow.Show();
Application.Current.MainWindow.Close();
}
ShowProgress= false;
}
objMainWindow.Show()正在引发错误-调用线程无法访问此对象,因为其他线程拥有它
在App.xaml中,我还将StartupUri设置为我的“登录”窗口
当用户单击“回车”按钮时,这可以立即显示忙指示灯,但在显示主窗口时失败
错误消息是“调用线程无法访问此对象,因为其他线程拥有它。”
只要我的主窗口(即主屏幕)未启动,我就必须显示总线指示器
是否有任何帮助可以纠正此问题?由于无法从后台线程访问UI元素,因此会引发异常 您必须从主/UI线程调用
objMainWindow.Show()
,或者让调度程序为您调用它
如果必须从backgorund线程调用它,可以这样做:
Action act = () =>
{
MainWindow objMainWindow = new MainWindow();
objMainWindow.Show();
Application.Current.MainWindow.Close();
};
System.Windows.Application.Current.Dispatcher.Invoke(act);
我建议您阅读以下内容,请尝试以下代码:
private void AsyncCallback(IAsyncResult result){
var dispatcher = Dispatcher.CurrentDispatcher;
dispatcher.Invoke(new Action(() =>
{
MainWindow objMainWindow = new MainWindow();
objMainWindow.Show();
Application.Current.MainWindow.Close();
}
}
编辑
public void LoadApplication()
{
ShowProgress= true;
if (AuthenticateUser)
{
var dispatcher = Dispatcher.CurrentDispatcher;
dispatcher.Invoke(new Action(() =>
{
MainWindow objMainWindow = new MainWindow();
objMainWindow.Show();
Application.Current.MainWindow.Close();
}
}
ShowProgress= false;
}
哪一行抛出错误?objMainWindow.Show();你试过用BeginInvoke吗?我没有试过BeginInvoke。你能推荐一些示例代码吗?在这种情况下如何使用dispatcher?谢谢你的帮助。我试过了,但现在它确实显示BusyIndicator和应用程序正在启动。很抱歉输入错误。它不显示BusyIndicator和应用程序启动时没有显示BusyIndicator。@user2519971这实际上是另一个问题;)为busyIndicator发布您的XAML。。。您能告诉我如何从ICommand enter命令调用AsyncCallback吗?我尝试了AsyncCallback=newAsyncCallback(AsyncCallback);但它并没有加载应用程序。在您的命令中调用LoadApplication?如果是这样,那么您只需用上面的示例替换“If(_ShowProgress!=value)”。我忘记进入第三行了,我迷路了。我需要把这件事进行下去吗?你能建议把哪个放在哪里吗?这对我会有很大的帮助。设置{AsyncCallback callback=new AsyncCallback(AsyncCallback);}您的错误是当您说“objMainWindow.Show();”时。不是;不是吗??或者进度是第二个问题??是objMainWindow.Show();是投掷错误。我只想解决这个问题。进度条不是一个问题。有什么想法吗?