C# 当结算日期时间剩余4分钟时启用按钮

C# 当结算日期时间剩余4分钟时启用按钮,c#,wpf,datetime,C#,Wpf,Datetime,我正在使用MvvmLight开发WPF应用程序。我想在设定的时间还剩4分钟时启用按钮。它应该在UI中自动启用。我应该使用线程来连续跟踪CurrentUTCtime和mytime的差异吗?如果是,那么如何使用此代码中的线程?这是我的密码 Datetime mytime = new DateTime(DateTime.Now.Year,DateTime.Now.Month,DateTime.Now.Day,22,0,0) public RelayCommand Open { get

我正在使用MvvmLight开发WPF应用程序。我想在设定的时间还剩4分钟时启用按钮。它应该在UI中自动启用。我应该使用线程来连续跟踪CurrentUTCtime和mytime的差异吗?如果是,那么如何使用此代码中的线程?这是我的密码

Datetime mytime = new DateTime(DateTime.Now.Year,DateTime.Now.Month,DateTime.Now.Day,22,0,0)

public RelayCommand Open
{
    get 
    { 
        return Open?? (_open= new RelayCommand(ExecuteOpen, CanExecuteOpen)); 
    }

    private void ExecuteOpen()
    {
        _navigation.NavigationToSetBetsDialogue();
    }

    private bool CanExecuteOpen()
    {
        double? remainingMinutes = null;

        DateTime CurrentUTCtime = DateTime.UtcNow;
        remainingMinutes = mytime .Subtract(CurrentUTCtime).TotalMinutes;

        if (remainingMinutes <= 4)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}
Datetime mytime=newdatetime(Datetime.Now.Year,Datetime.Now.Month,Datetime.Now.Day,22,0,0)
公共放松社区开放
{
得到
{ 
返回Open??(_Open=新的RelayCommand(ExecuteOpen、CanExecuteOpen));
}
私有void executepen()
{
_navigation.NavigationToSetBetsDialogue();
}
私人布尔CanExecuteOpen()
{
double?剩余分钟数=空;
DateTime CurrentUTCtime=DateTime.UtcNow;
remainingMinutes=mytime.Subtract(currentutcime).TotalMinutes;

如果(剩余分钟尝试使用Dispatcher:

        private DispatcherTimer _Timer = new DispatcherTimer();
        private bool _CanExecute;

        private void StartTimer()
        {
            var mytime = new DateTime( DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 22, 0, 0 );

            var interval = DateTime.UtcNow - mytime - TimeSpan.FromMinutes( 4 );
            _Timer.Interval = interval;
            _Timer.Tick += Timer_Tick;
        }

        private void Timer_Tick( object sender, EventArgs e )
        {
            _Timer.Tick -= Timer_Tick;
            _CanExecute = true;
            CommandManager.InvalidateRequerySuggested();
        }

        public ICommand Open
        {
            get { return new RelayCommand( ExecuteOpen, () => _CanExecute ); }
        }

您可以使用can-execute并检查运行时间,不需要单独的线程,因为can-execute将以并行方式运行

private DateTime _startTime;
private void StartCommandHandler(object obj)
    {
        _startTime = DateTime.Now;
    }

 private bool CanEnableButton(object arg)
    {
        return _startTime != DateTime.MinValue && DateTime.Now.Subtract(_startTime).Minutes >= 4;
    }

希望对您有所帮助

您可以使用
BackgroundWorker
完成此操作。首先,您需要初始化worker:

        BackgroundWorker bgWrkr = new BackgroundWorker();
        bgWrkr.DoWork += new DoWorkEventHandler(bgWrkrDoWork);
        bgWrkr.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWrkrRunWorkerCompleted);
然后实现事件的处理程序。
DoWork

void bgWrkrDoWork(object sender, DoWorkEventArgs e)
{
    while (mytime.Subtract(DateTime.UtcNow).TotalMinutes >= 4){ }
}
RunWorkerCompleted

void bgWrkrRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    button.IsEnabled = true;
}
确保您必须启动worker:

bgWrkr.RunWorkerAsync();

您可以在初始化.bgWrkr.RunWorkerAsync();

后立即启动它。我不想使用计时器。我想使用另一个线程连续检查差异(CurrentUTCtime mytime)。如何实现这一点?这正是计时器所做的,定期执行代码(本例中为时差检查)。没有“连续”编程中的概念-尤其是在UI方面