C# uwp异步方法跳过代码行

C# uwp异步方法跳过代码行,c#,asynchronous,methods,async-await,win-universal-app,C#,Asynchronous,Methods,Async Await,Win Universal App,我有一个void返回类型的异步方法。给你 public static async void LoadPlaylists() { if(playlistitems.Count==0) { var playlists = await ApplicationData.Current.LocalFolder.GetFilesAsync(); var c = playlists.Count; foreach (var playlist in

我有一个void返回类型的异步方法。给你

public static async void LoadPlaylists()
{
    if(playlistitems.Count==0)
    {
        var playlists = await ApplicationData.Current.LocalFolder.GetFilesAsync();
        var c = playlists.Count;
        foreach (var playlist in playlists)
        {
            var p = await Playlist.LoadAsync(playlist);
            var image = new BitmapImage();
            if (p.Files.Count == 0)
            {
                image.UriSource = new Uri("ms-appx:///Assets/Wide310x150Logo.scale-200.png");
            }
            else
            {
                image = await Thumbnail(p.Files[0]);
            }
            playlistitems.Add
            (
                new PlaylistItem
                {
                    playlist = p,
                    PlaylistName = playlist.DisplayName,
                    NumOfVid = p.Files.Count.ToString(),
                    Thumbnail = image
                }
            );
        }
    }
}
它是一个公共静态方法,所以我可以在任何地方使用它,我在一个页面上使用它来加载一些数据,它工作得很好,它完成了这个方法,然后在下一个代码行中继续前进。如下图所示

private void l1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    //some more code
    LoadPlaylists();
    //some more code
}
但当我在另一个事件处理程序的另一个页面上使用它时,它不是异步方法,它只运行第一行,然后跳过整个方法并向前移动。我知道它确实跳过了那些行,bcz我用break point检查过,我知道它跳过了,因为它是异步的,但我不希望这样,我只希望它完成整个方法,然后继续前进。因此,我在下一个代码行中不会遇到任何问题。我再次粘贴下面的代码,用注释向您展示它跳过的内容

public static async void LoadPlaylists()
{
    if(playlistitems.Count==0)
    {
        //it runs till here, when compiler goes to line below
        //it skips whole methods and exits it.
        var playlists = await ApplicationData.Current.LocalFolder.GetFilesAsync();
        var c = playlists.Count;
        foreach (var playlist in playlists)
        {
            var p = await Playlist.LoadAsync(playlist);
            var image = new BitmapImage();
            if (p.Files.Count == 0)
            {
                image.UriSource = new Uri("ms-appx:///Assets/Wide310x150Logo.scale-200.png");
            }
            else
            {
                image = await Thumbnail(p.Files[0]);
            }

            playlistitems.Add
            (
                new PlaylistItem
                {
                    playlist = p,
                    PlaylistName = playlist.DisplayName,
                    NumOfVid = p.Files.Count.ToString(),
                    Thumbnail = image
                }
            );
        }
    }
}
下面是我在异步事件处理程序中使用它的代码,以及它给我带来问题的原因

    private async void ME_MediaOpened(object sender, RoutedEventArgs e)
    {

        //When used here, it just skippes everything in the method
        //as i described on the comments in code above.

        LoadPlaylists();

        //after skipping the compiler comes here and tries to execute
        //the lines below, which obviously causes exceptions because
        above method was never completed to begin with.

        var sd = playlistitems.Count;
        //some more code
    }

您应该返回任务而不是void,这样您就可以等待方法完成。

您应该返回任务而不是void,这样您就可以等待方法完成。

返回任务而不是void,这样您就可以等待方法完成。返回任务而不是void,这样您就可以等待方法完成完成。异步编程总是让我困惑,非常感谢:)异步编程总是让我困惑,非常感谢:)