为什么此计数器在 Windows 上正确递增,但在 Android 上却不然?

问题描述 投票:0回答:3

我从 Maui 模板项目开始,您可以单击一个按钮来增加 MainPage 类中存储的数字。

我删除了 MainPage.xaml 中除标签之外的所有元素。我将此标签命名为 SpeedLabel,以便我可以从 MainPage 类中更改它。

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="Metero.MainPage">

<Label
    x:Name="SpeedLabel"
    Text="0"
    SemanticProperties.HeadingLevel="Level1"
    SemanticProperties.Description="Welcome to dot net Multi platform App U I"
    FontSize="80"
    HorizontalOptions="Center" 
    VerticalOptions="Center" />

</ContentPage>

现在在 MainPage C# 类 (MainPage.xaml.cs) 中,我将类更改为:

public partial class MainPage : ContentPage
{
    int count = 0;

    public MainPage()
    {
        InitializeComponent();
        SpeedLabelUpdate();
    }

    private async void SpeedLabelUpdate()
    {
        while (true) {
            count += 1;
            SpeedLabel.Text = count.ToString();
            await Task.Delay(100);
        }
    }
}

我希望这会生成一个应用程序,其数字在屏幕中心不断增加。它在 Windows 上按预期工作,但在 Android 上则不然。

在 Android 上,数字按预期增加到 9,但随后重置为 1,现在更新之间的延迟为 1000 毫秒,而不是 100。如果我继续下去,当它达到 9 时,它会再次重置,现在延迟为大约10000ms。

c# android asynchronous maui
3个回答
1
投票

这就是线程安全的方法。尝试看看这是否更适合您。

Dispatcher.StartTimer(TimeSpan.FromMilliseconds(100), () =>
{
    count += 1;
    SpeedLabel.Text = count.ToString();
    return true; 
});

1
投票
private async void SpeedLabelUpdate()
{
    while (true)
    {
        count += 1;
        TempLabel.Dispatcher.Dispatch(() =>
        {
            TempLabel.Text = count.ToString();
        });
        await Task.Delay(100);
    }
}

0
投票

这行代码:

SpeedLabelUpdate();

应在 Visual Studio 中显示警告。正确的?不要忽略该警告。

警告建议添加

await
。但你不能。这暗示您正在做的事情不可靠

通过创建一个

async
上下文来修复它,您可以从中
await
:

public MainPage()
{
    InitializeComponent();
    // Code inside here runs AFTER "MainPage()" method returns.
    // Use "Dispatcher.Dispatch", because SpeedLabelUpdate touches UI.
    Dispatcher.Dispatch( async() =>
    {
        await SpeedLabelUpdate();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.