【问题标题】:Task.Delay is skippedTask.Delay 被跳过
【发布时间】:2018-11-22 22:53:21
【问题描述】:

我的目标是反复播放 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());
}

【问题讨论】:

    标签: uwp task


    【解决方案1】:

    这总是会立即返回:

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

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

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

    【讨论】:

      【解决方案2】:

      @Gabriel 告诉我们为什么代码无法运行。

      我们需要更改abspielenAsync 中的代码以使任务运行。

      private async void abspielenAsync()
      

      我们应该在任务中将void 更改为Taskwait

      private async Task abspielenAsync()
      

      那我们应该修改 Characteristic_ValueChanged 中的代码

          while (true)
          {
              var t = Task.Run(async () => 
              {
                  await abspielenAsync();
                  return 42;
              });
              t.Wait();
          }
      

      方法名称应命名为PascalCase。见coding-style.md

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-04
        • 2015-08-23
        • 1970-01-01
        • 2023-03-29
        相关资源
        最近更新 更多