0

我在 C# 中有一个函数,它一开始将 GUI DateTimePicker 对象的值设置为今天的日期(时间 = 午夜),然后执行其他操作。通过 GUI 按钮执行时,函数 (DBIO_Morning) 运行良好。但是,通过定时操作执行:

private void SetupTimedActions()
{
   ...

   DateTime ref_morning = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 8, 16, 0);
   if (DateTime.Now < ref_morning)
      At.Do(() => DBIO_Morning(), ref_morning);
   ...
}

它在第二行失败:

private void DBIO_Morning()
{
   DateTime date_current = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 0, 0, 0);
   DTPicker_start.Value = date_current;
   ...
}

( At.Do 对象来自这里的第三个答案:C# execute action after X seconds

4

2 回答 2

0

控件不是线程安全的,这意味着您不能从另一个线程调用控件的方法。您可以等到控件的线程准备好使用以下命令处理您的操作Control.Invoke

private void DBIO_Morning()
{
    DateTime date_current = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 0, 0, 0);
    Action setValue = () => DTPicker_start.Value = date_current;
    if (DTPicker_start.InvokeRequired)
        DTPicker_start.Invoke(setValue);
    else
        setValue();
}
于 2011-12-17T13:45:54.620 回答
0

您正在尝试从另一个线程修改 GUI 元素,由At.Do(). 看到这个线程

使用System.Windows.Forms.TimerinAt.Do()而不是System.Threading.Timer可能会解决问题。(只需更改new Timer(...)new System.Windows.Forms.Timer(...)。)

于 2011-12-17T13:48:49.153 回答