C# uwp异步方法跳过代码行
我有一个void返回类型的异步方法。给你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
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,这样您就可以等待方法完成完成。异步编程总是让我困惑,非常感谢:)异步编程总是让我困惑,非常感谢:)