关于uwp:Task.Delay被跳过

 2021-04-26 

Task.Delay is skipped

我的目标是反复在uwp中播放音频文件。在这之间是等待时间,该时间会发生变化。

问题在于等待时间总是被跳过。

这是我尝试的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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());
}

这将总是立即返回:

1
2
3
4
5
6
var t = Task.Run(delegate
        {
            abspielenAsync();
            return 42;
        });
        t.Wait();

您的abspielenAsync方法未返回Task,因此无法等待它。因此,您只是在后台运行它,而不必等待它(通常称为"开火")。

如果要等到abspielenAsync()完成后再返回42,则使abspielenAsync方法返回Task并将其调用的位置更改为await abspielenAsync();


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

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

1
private async void abspielenAsync()

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

1
private async Task abspielenAsync()

然后我们应该更改Characteristic_ValueChanged

中的代码

1
2
3
4
5
6
7
8
9
    while (true)
    {
        var t = Task.Run(async () =>
        {
            await abspielenAsync();
            return 42;
        });
        t.Wait();
    }

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