我正在開發 Xamarin 應用程式。要求之一是在一定時間后注銷用戶。我設定了一個每 30 分鐘運行一次的計時器,以告訴用戶他的會話已過期,并讓他選擇繼續會話或注銷。如果他決定繼續他的會話,計時器將繼續每 30 分鐘運行一次,但如果他決定結束他的會話,計時器將停止。
Xamarin 中的計時器不遵守您在 StartTimer 上設定的時間,因為它甚至在 30 分鐘之前運行。
應用程式.xaml.cs
public App()
{
InitializeComponent();
MainPage = new NavigationPage(new LoginPage());
}
登錄頁面.xaml.cs
public LoginPage()
{
InitializeComponent();
CheckUserLoginStatus();
}
public async void CheckUserLoginStatus()
{
var msalService = new MsalAuthService();
if (await msalService.SignInAsync())
{
Settings.UserLastLogin = DateTime.Now;
App.Current.MainPage = new Master();
}
}
MsalAuthService.cs
public async Task<bool> SignInAsync()
{
try
{
// login logic here
//after successfull login start timer
Device.StartTimer(new TimeSpan(0, 30, 0), () =>
{
// do something every 30 minutes
Device.BeginInvokeOnMainThread(async () =>
{
// interact with UI elements
await AutoLogout();
});
var accessToken = ApplicationPropertyProvider.GetProperty<string>(Commons.AUTH_TOKEN);
return !string.IsNullOrEmpty(accessToken);
});
Application.Current.Properties["USERLOGINDATE"] = DateTime.Now;
return !string.IsNullOrEmpty(accessToken);
}
return true;
}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
return false;
}
}
uj5u.com熱心網友回復:
它可以在沒有計時器的情況下定期與用戶互動:
using System.Diagnostics;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace XFSOAnswers
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class PeriodicInteractPage : ContentPage
{
public PeriodicInteractPage()
{
InitializeComponent();
StartPeriodicTask(5, GetUserConfirmation, Done);
}
delegate Task<bool> TaskBoolDeleg();
delegate Task TaskDeleg();
private void StartPeriodicTask(float seconds, TaskBoolDeleg periodicTask, TaskDeleg doneTask)
{
// On MainThread, so can interact with user.
// "async" "await Delay" ensures UI is not blocked until time is up.
Device.BeginInvokeOnMainThread(async () =>
{
bool alive = true;
while (alive)
{
await Task.Delay((int)(1000 * seconds));
alive = await periodicTask();
}
await doneTask();
});
}
private async Task<bool> GetUserConfirmation()
{
// Block UI until user responds.
bool answer = await DisplayAlert("", "Are you still there?", "Yes", "No");
Debug.WriteLine($"--- Still there: {answer} ---");
return answer;
}
private async Task Done()
{
Debug.WriteLine($"--- DONE ---");
await DisplayAlert("", "Logout", "OK");
}
}
}
StartPeriodicTask(5, GetUserConfirmation, Done);將GetUserConfirmation在 5 秒后呼叫。根據需要增加。
如果用戶回答“是”,則時間延遲再次開始。
如果用戶回答“否”,則回圈退出,Done運行。
信用:松散地基于https://stackoverflow.com/a/45364589/199364中的“無計時器”方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/480350.html
標籤:C# IOS xamarin xamarin.forms
