我的目标是反复在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());
}
答案 0 :(得分:2)
这将总是立即返回:
var t = Task.Run(delegate
{
abspielenAsync();
return 42;
});
t.Wait();
您的abspielenAsync
方法未返回Task
,因此无法等待。因此,您只是在后台运行它,而不必等待它(通常称为“开火”)。
如果要等到abspielenAsync()
完成之后再返回42
,则使您的abspielenAsync
方法返回Task
并将其调用位置更改为{{1} }。
答案 1 :(得分:-1)
@Gabriel告诉我们为什么代码无法运行。
我们需要更改abspielenAsync
中的代码以使任务运行。
private async void abspielenAsync()
我们应该在任务中将void
更改为Task
并wait
。
private async Task abspielenAsync()
然后我们应该更改Characteristic_ValueChanged中的代码
while (true)
{
var t = Task.Run(async () =>
{
await abspielenAsync();
return 42;
});
t.Wait();
}
方法名称应命名为PascalCase。参见coding-style.md