gpt4 book ai didi

xamarin - 如果我运行每分钟运行一次并从 App.Xaml.cs OnStart() 调用的异步方法,是否存在任何可能的性能问题?

转载 作者:行者123 更新时间:2023-12-02 05:33:32 26 4
gpt4 key购买 nike

我有这段代码,我的意图是当应用程序打开时,它将每分钟运行一个名为 PointChecker.CheckPoints(); 的方法。

此方法使用 db2.Execute("UPDATE ..... etc"); 同步对我的数据库运行更新

根据我阅读本文的理解:

https://xamarinhelp.com/xamarin-forms-async-task-startup/

我可以通过几种不同的方式来实现这一点。

我想知道的是,运行这样的代码是否存在任何性能问题,如果我考虑以不同的方式运行它,则可以减少这些问题。特别是 Xamarin.Forms 的工作方式最近是否有任何变化(我的应用程序通过 Forms 在 iOS 和 Android 上运行),我应该考虑这些变化,这可能会导致更好的方法来完成此任务。

    public App() {
InitializeComponent();
DB.PopulateTables();
MainPage = new Japanese.MainPage();
}

protected override async void OnStart() {
await Task.Run(() => {
StartTimer();
});
}

public void StartTimer() {
if (!stopWatch.IsRunning)
stopWatch.Start();
Device.StartTimer(new TimeSpan(0, 0, 1), () => {
if (stopWatch.IsRunning && stopWatch.Elapsed.Minutes >= 1) {
PointChecker.CheckPoints();
stopWatch.Restart();
}
return true;
});
}
protected override void OnSleep() {
stopWatch.Reset(); base.OnSleep();
}
protected override void OnResume() {
base.OnResume(); stopWatch.Start();
}

最佳答案

最近对 Xamarin 的更改不应影响这一点。这种方法是最有效的方法。我唯一要考虑的是为什么你的方法需要异步。您可以调用:

 protected override void OnStart()

another thread讨论了非 UI 阻塞的解决方案:

using Xamarin.Forms;
using System;
using System.Linq;
using System.Diagnostics;

namespace YourNamespace
{
public partial class App : Application
{
private static Stopwatch stopWatch = new Stopwatch();
private const int defaultTimespan = 1;

protected override void OnStart()
{
// On start runs when your application launches from a closed state,

if (!StopWatch.IsRunning)
{
StopWatch.Start();
}

Device.StartTimer(new TimeSpan(0, 0, 1), () =>
{
// Logic for logging out if the device is inactive for a period of time.

if (StopWatch.IsRunning && StopWatch.Elapsed.Minutes >= defaultTimespan)
{
//prepare to perform your data pull here as we have hit the 1 minute mark

// Perform your long running operations here.

InvokeOnMainThread(()=>{
// If you need to do anything with your UI, you need to wrap it in this.
});

stopwatch.Restart();
}

// Always return true as to keep our device timer running.
return true;
});
}

protected override void OnSleep()
{
// Ensure our stopwatch is reset so the elapsed time is 0.
StopWatch.Reset();
}

protected override void OnResume()
{
// App enters the foreground so start our stopwatch again.
StopWatch.Start();
}
}
}

最重要的是,这个方法是

Platform agnostic

关于xamarin - 如果我运行每分钟运行一次并从 App.Xaml.cs OnStart() 调用的异步方法,是否存在任何可能的性能问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52581911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com