Task.Delay пропущен - PullRequest
       8

Task.Delay пропущен

0 голосов
/ 03 ноября 2018

Моя цель - повторно воспроизвести аудиофайл в формате 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());
}

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

@ Габриэль говорит нам, почему код не запускается.

И нам нужно изменить код в 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

0 голосов
/ 03 ноября 2018

Это всегда вернется немедленно:

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

Ваш abspielenAsync метод не возвращает Task, поэтому его нельзя ожидать. Таким образом, вы просто запускаете его в фоновом режиме и не ожидаете его (обычно это называется «Огонь и забудь»).

Если вы хотите подождать, пока abspielenAsync() не будет завершено, прежде чем возвращать 42, сделайте так, чтобы ваш abspielenAsync метод возвратил Task и измените место вызова на await abspielenAsync();.

...