1

これはばかげた質問かもしれません。しかし、Live SDK の例から 1 つの例を変更すると、奇妙な問題が発生しました。

根本的な原因は、非同期関数 GetAll() が同期的に使用されたことだと考えていました。

以下はコードスニペットです。問題をコメントとして入れました。前もって感謝します!

class SkyeDriveViewModel: INotifyPropertyChanged
{
    private List<SkyDriveItem> folderList = null;
    public List<SkyDriveItem> FolderList
    {
        get { return folderList; }
        private set
        {
            if (value != folderList)
            {

                folderList = value;
                NotifyPropertyChanged("FolderList");
            }
        }
    }

    private async void GetAll(string desiredPath)
    {
        FolderList = new List<SkyDriveItem>();

        this.liveClient = new LiveConnectClient(SkyDrivePage.Session);
        try
        {
            LiveOperationResult operationResult = await this.liveClient.GetAsync(desiredPath);
            dynamic result = operationResult.Result;

            dynamic items = result.data;
            foreach (dynamic item in items)
            {
                SkyDriveItem newItem = new SkyDriveItem(item);
                if (newItem.IsFolder)
                {
                    FolderList.Add(newItem);
                }

            }

        }
        catch (LiveConnectException e)
        {
        }
        //**till here, FolderList was assigned**
    }

    public void InitList()
    {
        Debugger.Log();
        GetAll(SKYDRIVEINITPATH);
        Debugger.LogWhen(eDebugger.LogTiming.Exit); 
        //**till here, FolderList had zero item**
    }

}
4

1 に答える 1

5

一般に、async void機能を持つことは警告サインです。このようなメソッドは、イベント ハンドラーに対してのみ使用する必要があります。の適切な戻り値の型GetAllTask、または場合によっては偶数Task<List<SkyDriveItem>>です。

問題は、呼び出しGetAllが最初の呼び出しに到達するまでコードを実行するだけawaitであり、その時点で呼び出し元に戻り、メソッドの残りの部分が非同期で実行されることです。

ここでの問題は、メソッドがvoidいつ完了したかを知る方法がないことです。あなたは「発射して忘れる」方法を持っており、リストが実際にいつ準備できるかを知ることはできません. GetAllタスクが返された場合は、awaitそのタスクを実行して、リストが実際に入力されていることを確認してください。

于 2013-05-16T20:22:32.830 に答える