Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我需要在程序加载时启动resetTimer()-这是如何完成的?_C#_Wpf_Timer - Fatal编程技术网

C# 我需要在程序加载时启动resetTimer()-这是如何完成的?

C# 我需要在程序加载时启动resetTimer()-这是如何完成的?,c#,wpf,timer,C#,Wpf,Timer,我正在学习一些WPF,并编写了这个小程序,可以读取Excel文件中的数据,并在保存时更新UI。只有在第一次保存后,我的ResetTimer()函数才能工作。但是GetDisplayData()会加载数据,程序会在保存时更新数据。只有在第一次保存之前,计时器才会启动 但我希望计时器立即启动,以防加载时Excel文件上没有保存事件 我能做些什么来让它工作,似乎每当我尝试将它放在window_loaded或其他我尝试过的地方,我的程序就会循环或不加载数据 谢谢你的帮助 using System; us

我正在学习一些WPF,并编写了这个小程序,可以读取Excel文件中的数据,并在保存时更新UI。只有在第一次保存后,我的ResetTimer()函数才能工作。但是GetDisplayData()会加载数据,程序会在保存时更新数据。只有在第一次保存之前,计时器才会启动

但我希望计时器立即启动,以防加载时Excel文件上没有保存事件

我能做些什么来让它工作,似乎每当我尝试将它放在window_loaded或其他我尝试过的地方,我的程序就会循环或不加载数据

谢谢你的帮助

using System;
using System.Data;
using System.IO;
using System.Windows;
using System.Windows.Threading;

namespace WPFReadExcel
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
      private const string ExcelPath = @"C:\";
      private const string ExcelPathFile = @"C:\DataSource.xlsx";
      DataTable _dashBoardData = new DataTable();

      public MainWindow()
      {
        InitializeComponent();
      }

      protected void Window_Loaded(object sender, RoutedEventArgs e)
      {
        GetDisplayData();
        StartFileSystemWatcher();
      }

      public void GetDisplayData()
      {
        var excelData = new ExcelData();
        _dashBoardData = excelData.ReadExcelFile("Live", ExcelPathFile);

         Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
         {
           ExcelDataGrid.ItemsSource = _dashBoardData.AsDataView();
           RefreshDateTime.Content = "Refresh at: " + 
                                      DateTime.Now.ToShortTimeString();
          }
          ));
      }

      private void ResetDisplayData()
      {
        if (_dashBoardData != null) _dashBoardData.Dispose();
        GetDisplayData();
        ResetTimer();

      }

      private void ResetTimer()
      {
        while (true)
        {
          System.Threading.Thread.Sleep(20000);
          ResetDisplayData();
        }
      }

      private void StartFileSystemWatcher()
      {
        if (string.IsNullOrWhiteSpace(ExcelPath))
           return;

        FileSystemWatcher watcher = new FileSystemWatcher();

        // set directory to watch
        watcher.Path = ExcelPath;

       // set what to watch for
       watcher.NotifyFilter = NotifyFilters.LastWrite;

       // set event handlers
       watcher.Changed += new FileSystemEventHandler(watcher_Changed);

       // start watching
       watcher.EnableRaisingEvents = true;
      }

      private void watcher_Changed(object sender, FileSystemEventArgs e)
      {
        ResetDisplayData();
      }

      private void Label_Loaded(object sender, RoutedEventArgs e)
      {
        RefreshDateTime.Content = "Refresh at: " + DateTime.Now.ToShortTimeString();
      }
  }
使用系统;
使用系统数据;
使用System.IO;
使用System.Windows;
使用System.Windows.Threading;
名称空间wpfradexcel
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
私有常量字符串ExcelPath=@“C:\”;
私有常量字符串ExcelPathFile=@“C:\DataSource.xlsx”;
DataTable_dashBoardData=新DataTable();
公共主窗口()
{
初始化组件();
}
已加载受保护的无效窗口(对象发送器,路由目标e)
{
GetDisplayData();
StartFileSystemWatcher();
}
public void GetDisplayData()
{
var excelData=新的excelData();
_dashBoardData=excelData.ReadExcelFile(“Live”,ExcelPathFile);
Dispatcher.BeginInvoke(DispatcherPriority.Normal,新操作(()=>
{
ExcelDataGrid.ItemsSource=_dashBoardData.AsDataView();
RefreshDateTime.Content=“刷新时间:”+
DateTime.Now.ToShortTimeString();
}
));
}
私有void ResetDisplayData()
{
如果(_dashBoardData!=null)_dashBoardData.Dispose();
GetDisplayData();
重置计时器();
}
私有void ResetTimer()
{
while(true)
{
系统。线程。线程。睡眠(20000);
重置显示数据();
}
}
私有void StartFileSystemWatcher()
{
if(string.IsNullOrWhiteSpace(ExcelPath))
返回;
FileSystemWatcher watcher=新的FileSystemWatcher();
//设置要监视的目录
watcher.Path=ExcelPath;
//设置要监视的内容
watcher.NotifyFilter=NotifyFilters.LastWrite;
//设置事件处理程序
watcher.Changed+=新文件系统EventHandler(watcher\u Changed);
//开始看
watcher.EnableRaisingEvents=true;
}
私有无效观察程序\u已更改(对象发送方、文件系统目标)
{
重置显示数据();
}
已加载专用无效标签(对象发送器,路由目标e)
{
RefreshDateTime.Content=“刷新时间:”+DateTime.Now.ToShortTimeString();
}
}

}

窗口。加载的事件是执行所需操作的正确位置:

protected void Window_Loaded(object sender, RoutedEventArgs e)
{
    ResetTimer();
    GetDisplayData();
    StartFileSystemWatcher();
}
但是,您似乎没有在任何地方使用
计时器
,因此您的问题和方法名称不合适。在WPF中,我们使用。首先,您需要初始化它,然后启动它:

private DispatcherTimer timer = new DispatcherTimer();

就您的信息而言,您真的无法编写比这更糟糕的代码,因为它会阻塞您的UI并使您的应用程序无响应:

while (true)
{
    System.Threading.Thread.Sleep(20000);
    ResetDisplayData();
}

我不太擅长WPF,但是为什么不使用real timer来代替Thread.Sleep()?有关如何使用Dispatchermer的信息,请参见以下内容:。第二件事-程序加载时会发生什么?GetDisplayData()不显示您需要的内容?从描述上看不清楚。@Ilyaluzianin,我来看看。我更新了我的描述。开始时数据加载很好,但直到第一次保存Excel工作表后计时器才启动。什么计时器???你没有@伊利亚卢齐亚宁再次感谢你们。我添加了一个调度员,它工作得非常好。如果你回答,我会把它标为答案。没关系,谢里登已经给出了一个很好的答案!干杯
while (true)
{
    System.Threading.Thread.Sleep(20000);
    ResetDisplayData();
}