首页 > 解决方案 > 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());
}

标签: uwptask

解决方案


这将始终立即返回:

var t = Task.Run(delegate
        {
            abspielenAsync();
            return 42;
        });
        t.Wait();

您的abspielenAsync方法没有返回 a Task,因此不能等待。所以你只是在后台运行它而不是等待它(通常称为“一劳永逸”)。

如果您想等到abspielenAsync()完成后再返回42,则让您的abspielenAsync方法返回Task并更改调用它的位置await abspielenAsync();


推荐阅读