Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在线程上显示忙指示器并启动应用程序:线程错误(调用线程无法访问此对象)_C#_.net_Wpf - Fatal编程技术网

C# 在线程上显示忙指示器并启动应用程序:线程错误(调用线程无法访问此对象)

C# 在线程上显示忙指示器并启动应用程序:线程错误(调用线程无法访问此对象),c#,.net,wpf,C#,.net,Wpf,我正在开发一个WPF应用程序,并遵循MVVM方法。当用户单击“输入”按钮时,我必须在我的登录屏幕上显示忙指示灯。在“回车”按钮上,我有一个名为“EnterCommand”的ICommand,它会检查身份验证,然后加载主窗口 private ICommand _EnterCommand; public ICommand EnterCommand { get { return _EnterCommand ?? (_EnterCommand = new Delegate

我正在开发一个WPF应用程序,并遵循MVVM方法。当用户单击“输入”按钮时,我必须在我的登录屏幕上显示忙指示灯。在“回车”按钮上,我有一个名为“EnterCommand”的ICommand,它会检查身份验证,然后加载主窗口

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();是投掷错误。我只想解决这个问题。进度条不是一个问题。有什么想法吗?