如何使用 dispatchertimer 每 30 秒检查一次而不影响 c# 中的 UI?

How to check every 30seconds with dispatchertimer without affect the UI in c#?

我曾尝试使用以下代码每 30 秒检查一次来自服务器的报告,但在 30 秒后,应用程序挂起数 seconds.How 以避免挂起问题。 下面的代码我试过了,想在这方面做出什么改变?

System.Windows.Threading.DispatcherTimer dispatcherTimer2 = new System.Windows.Threading.DispatcherTimer();
 dispatcherTimer2.Tick += new EventHandler(dispatcherTimer2_Tick);
 dispatcherTimer2.Interval = new TimeSpan(0, 0, 30);


Public void dispatcherTimer2_Tick(object sender, EventArgs e)
{
   dispatcherTimer2.start();
    //code for function call autoreport();
}

这对我有用

 public Form1()
    {
        InitializeComponent();

        var timer = new System.Timers.Timer(500);
        // Hook up the Elapsed event for the timer.
        timer.Elapsed += timer_Elapsed;
        timer.Enabled = true;
    }

    void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        Invoke(
          new Action(() =>
          {
              label1.Text += "Test Label";
              Application.DoEvents();
          }));
    }

DispatcherTimer 回调在主 UI 线程上执行并阻塞它。 使用 System.Threading.Timer,如果您需要从定时器回调更新用户界面,请使用以下方法之一 Dispatcher.Invoke 过载。 在这样的代码中

public partial class MainWindow : Window
{
    System.Threading.Timer timer;
    public MainWindow()
    {
        InitializeComponent();
        timer = new System.Threading.Timer(OnCallBack, null, 0, 30 * 1000);
    }


    private void OnCallBack(object state)
    {
        //code to check report 
        Dispatcher.Invoke(() =>
        {
            //code to update ui
            this.Label.Content = string.Format("Fired at {0}", DateTime.Now);
        });
    }
}
var timer = new System.Threading.Timer(
    delegate
    {
        //--update functions here (large operations)
        var value = Environment.TickCount;

        //--run update using interface thread(UI Thread)

        //--for WinForms
        Invoke(
            new Action(() =>
            {
                //--set the value to UI Element
            }));

        //--for WPF
        Dispatcher.Invoke(
            new Action(() =>
            {
                //--set the value to UI Element
            }), null);
    });
var period = TimeSpan.FromSeconds(30);
timer.Change(period, period);

希望对您有所帮助。