Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.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#_Mvvm_Asynchronous_Async Await - Fatal编程技术网

C# 如何等待异步方法返回?

C# 如何等待异步方法返回?,c#,mvvm,asynchronous,async-await,C#,Mvvm,Asynchronous,Async Await,我正在尝试创建一个应用程序,它使用单点登录live connect,并根据用户的live connect信息自动注册用户 当我的应用程序启动时,我调用LiveConnectViewModel并调用这两个函数: public async void AuthInitialize() { string[] scopes = new[] { "wl.signin", "wl.basic", "wl.photos", "wl.emails", "wl.skydri

我正在尝试创建一个应用程序,它使用单点登录live connect,并根据用户的live connect信息自动注册用户

当我的应用程序启动时,我调用LiveConnectViewModel并调用这两个函数:

        public async void AuthInitialize() 
    {
        string[] scopes = new[] { "wl.signin", "wl.basic", "wl.photos", "wl.emails", "wl.skydrive" };

        liveAuthClient = new LiveAuthClient();
        LiveLoginResult liveLoginResult = await liveAuthClient.InitializeAsync(scopes);

        if (liveLoginResult.Status == LiveConnectSessionStatus.Connected)
        {
            App.Session = liveLoginResult.Session;
        }
        else 
        {
            liveLoginResult = await liveAuthClient.LoginAsync(scopes);
            App.Session = liveLoginResult.Session;
        }
        await LoadProfileAsync();
    }

    public async Task LoadProfileAsync() 
    {
        LiveConnectClient client = new LiveConnectClient(App.Session);
        LiveOperationResult liveOperationResult = await client.GetAsync("me");
        LiveOperationResult liveOperationResultPicture = await client.GetAsync("me/picture");
        dynamic dynResult = liveOperationResult.Result;
        dynResult.picture = liveOperationResultPicture.Result;
        User currentUser = await UserViewModel.findOrCreateUserAsync(dynResult);
        App.currentUser = currentUser;
    }
紧接着,当启动屏幕消失,出现我的视图时,另一个方法被调用

这将执行该代码:

        public ProfilePageViewModel()
    {
        this.CurrentUser = App.currentUser;
    }
现在我的问题是这里的时机。当我调试我的应用程序时,我可以看到我的LiveConnectViewModel首先被调用并进行初始连接,然后LoadProfileAsync被执行,直到我的程序到达第一个等待语句

当到达此点时,我的应用程序立即停止处理此调用并继续。现在,当谈到我的ProfilePageViewModel并且它应该设置我的“CurrentUser”属性时,Wait仍然没有将我的用户返回到我的App.CurrentUser属性,这就是为什么它说它为null

通常我会一直等到App.CurrentUser属性设置为null以外的值,但我无法摆脱一种奇怪的感觉,即我要么没有正确实现MVVM模式,要么我对wait和async做了一些非常错误的事情

有人能帮我澄清一下这种行为吗

你应该

一旦您执行了
AuthInitializeAsync
return
Task
而不是
void
,您就可以在创建视图模型之前等待它了。

您应该这样做


一旦您使用
AuthInitializeAsync
return
Task
而不是
void
,那么您可以在创建视图模型之前
等待它。

从LoadProfileAsync()调用前面删除
wait
;已在LoadProfileAsync()中完成了等待操作。
await
ing。如果这更适合您的业务需要,也可以在LoadProfileAsync()中完成等待操作。无需等待两次,这样做只会混淆问题。从LoadProfileAsync()调用前面删除
wait
;已在LoadProfileAsync()中完成了等待操作。
await
ing。如果这更适合您的业务需要,也可以在LoadProfileAsync()中完成等待操作。没有必要等两次,这样做只会把事情弄糊涂。嗨,斯蒂芬,谢谢你的回答。我已经在stackoverflow上的另一篇文章中读到了你的MSDN文章。我的问题是,如果我将返回类型更改为Task,我将无法在构造函数中正确调用此函数(这就是我实际正在做的)。有什么方法可以让我的构造器仍然工作吗?我有一篇博客。在我的MVVM项目中,我使用
async
factory方法遵循VM-first模式。但是如果您使用的是IoC或V-first模式,那么您需要使用我的博客中描述的异步初始化模式。嗨,Stephen,谢谢您的回答。我已经在stackoverflow上的另一篇文章中读到了你的MSDN文章。我的问题是,如果我将返回类型更改为Task,我将无法在构造函数中正确调用此函数(这就是我实际正在做的)。有什么方法可以让我的构造器仍然工作吗?我有一篇博客。在我的MVVM项目中,我使用
async
factory方法遵循VM-first模式。但是如果您使用的是IoC或V-first模式,那么您需要使用异步初始化模式,如我的博客中所述。