uwp - Task.Delay 被跳过
问题描述
我的目标是反复播放 uwp 中的音频文件。中间是等待时间,这会发生变化。
问题是等待时间总是被跳过。
这是我尝试过的:
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());
}
解决方案
这将始终立即返回:
var t = Task.Run(delegate
{
abspielenAsync();
return 42;
});
t.Wait();
您的abspielenAsync
方法没有返回 a Task
,因此不能等待。所以你只是在后台运行它而不是等待它(通常称为“一劳永逸”)。
如果您想等到abspielenAsync()
完成后再返回42
,则让您的abspielenAsync
方法返回Task
并更改调用它的位置await abspielenAsync();
。
推荐阅读
- mongodb - 在聚合查找匹配表达式中引用 root _id 不起作用
- compilation - 如何线性化这个方程并在 FreeFEM++ 代码中实现它?
- typescript - 在 TypeScript 中创建条件类型的对象
- java - 创建一个 Spring Framework 启动项目,而不是 Spring Boot
- svelte - 如何判断 Svelte 组件的属性已被父级更改?
- ide - 数据科学家在工业中最常使用哪个 IDE?
- mysql - 在多个条件下引用子查询
- java - Tomcat 连接池问题 - 无法在关闭的连接上调用方法
- apache - 301 使用 .htaccess 重定向到新域并编辑一些特定链接
- javascript - 如何访问 React 组件中动态生成/渲染的子级?