Task.Delay is skipped
我的目标是反复在uwp中播放音频文件。在这之间是等待时间,该时间会发生变化。
问题在于等待时间总是被跳过。
这是我尝试的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | private async Task Characteristic_ValueChanged(GattCharacteristic sender, GattValueChangedEventArgs args) { while (true) { var t = Task.Run(delegate { abspielenAsync(); return 42; }); t.Wait(); } } private async void abspielenAsync() { if (neu) { await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { mysong = new MediaElement(); }); Windows.Storage.StorageFolder folder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync("Assets"); Windows.Storage.StorageFile file = await folder.GetFileAsync("he.wav"); var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read); await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { mysong.SetSource(stream, file.ContentType); }); neu = false; } await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { mysong.Play(); while(mysong.CurrentState == Windows.UI.Xaml.Media.MediaElementState.Playing) { } }); await Task.Delay((int)(waitingtime * 1000)); Debug.WriteLine((waitingtime * 1000).ToString()); } |
这将总是立即返回:
1 2 3 4 5 6 | var t = Task.Run(delegate { abspielenAsync(); return 42; }); t.Wait(); |
您的
如果要等到
@Gabriel告诉我们为什么代码不运行。
我们需要更改
1 | private async void abspielenAsync() |
我们应该在任务中将
1 | private async Task abspielenAsync() |
然后我们应该更改Characteristic_ValueChanged
中的代码
1 2 3 4 5 6 7 8 9 | while (true) { var t = Task.Run(async () => { await abspielenAsync(); return 42; }); t.Wait(); } |
方法名称应命名为PascalCase。参见coding-style.md