我从 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。
这就是线程安全的方法。尝试看看这是否更适合您。
Dispatcher.StartTimer(TimeSpan.FromMilliseconds(100), () =>
{
count += 1;
SpeedLabel.Text = count.ToString();
return true;
});
private async void SpeedLabelUpdate()
{
while (true)
{
count += 1;
TempLabel.Dispatcher.Dispatch(() =>
{
TempLabel.Text = count.ToString();
});
await Task.Delay(100);
}
}
这行代码:
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();
}
}