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

5rgfhyps  于 2023-08-01  发布在  Android
关注(0)|答案(3)|浏览(115)

我从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,现在更新之间的延迟是1000ms而不是100。如果我让它继续,当它达到9时它会再次重置,现在延迟大约是10000毫秒。

gwbalxhn

gwbalxhn1#

这就是你如何做到线程安全。试着看看这是否对你更有效。

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

字符串

inkz8wg9

inkz8wg92#

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

字符串

t5fffqht

t5fffqht3#

这行代码:

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();
    }
}

相关问题