持续检查不同螺纹的状况

本文关键字:检查 | 更新日期: 2023-09-27 18:27:29

我有两个日期时间。一个是最新的,另一个是比赛开始的日期时间。现在我想在后台线程中不断检查这个Minutes差异(我不知道线程)。当它满足if(remainingMinutes<=4)时,我想更新UI。如何在后台使用线程来实现这一点?

public RelayCommand OpenSetBets
    {
        get { return _setBets ?? (_setBets = new RelayCommand(ExecuteSetBets, CanExecuteSetBets)); }
    }
    private void ExecuteSetBets()
    {
        _navigation.NavigationToSetBetsDialogue();
    }
    private bool CanExecuteSetBets()
    {
        // Thread t = new Thread(newthread);
        double? remainingMinutes = null;
        if (UK_RaceDetail.Count() != 0)
        {
            //t.Start();                     
            DateTime CurrentUTCtime = DateTime.UtcNow;
            DateTime NextRaceTime = UK_RaceDetail[0].One.Time;
            remainingMinutes = NextRaceTime.Subtract(CurrentUTCtime).TotalMinutes;
        }
        if (remainingMinutes <= 4)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

更新的代码。若比赛将在接下来的4分钟内开始,我想启用按钮。

持续检查不同螺纹的状况

如果您只想使用后台任务来监视日期/时间,我建议您不要创建新的Thread

对于WPF,您可以尝试使用DispatcherTimer对象及其Tick事件,而不是线程

System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += dispatcherTimer_Tick;

对于WinForms,可以将Timer对象与其Tick事件一起使用

System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
timer.Tick += timer_Tick;

这样,使用ThreadThreadPool 可以避免更复杂的解决方案

编辑:要使用Task.Delay,因为有些人更喜欢这种"更干净"的方式,请参阅Aron 先生的评论

您可以使用Task.Run like,

System.Threading.Tasks.Task.Run(async () =>
{
    //starts running in threadpool parallelly
    while (!CanExecuteSetBets())
    {
        await Task.Delay(500); //wait 500 milliseconds after every check
    }
    DoYourWork(); //trigger your work here
}).ConfigureAwait(false);