计时器事件未触发按钮单击

林吉尼

我试图转移Image file每3秒钟显示从源到目标目录,当我点击“开始”按钮“停止”按钮是停止文件传输。

如果我第三次使用“开始”按钮,则该事件未触发;因此,文件没有传输。

我已经完成的进度如下:

  1. 开始---文件传输;按下STOP按钮//也可以正常工作。
  2. 开始---文件传输;按下停止按钮//也可以正常工作。
  3. 开始-----文件未传输,Event is not firing //无效!

我为解决问题所做的工作:

  • 我在Tick事件中设置了一个断点,而tick事件未触发。
  • 我检查了SourceFiles.Count是否大于TransferCount (SourceFiles.Count> TransferCount)
  • 我注意到在文件传输过程中,如果在文件传输过程中单击“停止”按钮,则该特定文件将保持未传输状态。

我怎样才能解决这个问题?先感谢您。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Threading;

namespace GridTest
{
    /// <summary>
    /// Interaction logic for Window3.xaml
    /// </summary>
    public partial class Window3 : Window
    {
        DispatcherTimer dispatcherTimer = new DispatcherTimer();
        private static List<string> SourceFiles = new List<string>();
        private static readonly string SourceDir = @"C:\TestFiles\Images\";
        private static readonly string DestinationDir = @"C:\Files\Images\3_5x5\";
        private static int TransferCount = 0;
        public Window3()
        {
            InitializeComponent();
            this.Loaded += Window3_Loaded;
        }
        void Window3_Loaded(object sender, RoutedEventArgs e)
        {
            dispatcherTimer.Interval = new TimeSpan(0, 0, 3);
            dispatcherTimer.Tick += dt_Tick;
        }
        void dt_Tick(object sender, EventArgs e)
        {
            if (TransferCount < SourceFiles.Count)
            {
                var fileName = System.IO.Path.GetFileName(SourceFiles[TransferCount]);
                var destFile = System.IO.Path.Combine(DestinationDir, fileName);
                System.IO.File.Copy(SourceFiles[TransferCount], destFile,true);
                System.IO.File.Delete(SourceFiles[TransferCount]);
                Console.WriteLine(string.Format("Total Files: {0} Number of files transferred: {1}", SourceFiles.Count, TransferCount + 1));
                TransferCount += 1;
            }
            else
            {
                Console.WriteLine(string.Format("Total number of files transferred: {0}. Transfer Completed", TransferCount + 1));
                (sender as DispatcherTimer).Stop();
                (sender as DispatcherTimer).Tick -= dt_Tick;
            }
        }

        private void Start_Click(object sender, RoutedEventArgs e)
        {
            if (!System.IO.Directory.Exists(DestinationDir))
            {
                System.IO.Directory.CreateDirectory(DestinationDir);
            }

            if (System.IO.Directory.Exists(SourceDir))
            {
                SourceFiles = Directory.GetFiles(SourceDir).ToList();
            }
        }

        private void Stop_Click(object sender, RoutedEventArgs e)
        {
            dispatcherTimer.Stop();
        }
    }
}
史蒂夫

如果调用Stop,则在将IsEnabled属性设置为true之前,不会触发计时器事件。
所以我建议做一些重构

    void Window3_Loaded(object sender, RoutedEventArgs e)
    {
        LoadSourceFiles();
        StartTimer();
    }
    void StartTimer()
    {
        dispatcherTimer.Interval = new TimeSpan(0, 0, 3);
        dispatcherTimer.Tick += dt_Tick;
        dispatcherTimer.IsEnabled = true;
    }
    void LoadSourceFiles()
    {
        if (!System.IO.Directory.Exists(DestinationDir))
        {
            System.IO.Directory.CreateDirectory(DestinationDir);
        }

        if (System.IO.Directory.Exists(SourceDir))
        {
            SourceFiles = Directory.GetFiles(SourceDir).ToList();
        }
    }

并在每次按“开始”按钮时调用此方法

    private void Start_Click(object sender, RoutedEventArgs e)
    {
        StartTimer();
    }

    private void Stop_Click(object sender, RoutedEventArgs e)
    {
        dispatcherTimer.IsEnabled = false;
    }

我还建议您在Tick事件中发现每个文件都已传输(或禁用“开始”按钮)时,将全局变量重置为跟踪文件传输为零的全局变量。

    ....
    else
    {
          Console.WriteLine(string.Format("Total number of files transferred: {0}. Transfer Completed", TransferCount + 1));
          (sender as DispatcherTimer).Stop();
          (sender as DispatcherTimer).Tick -= dt_Tick;
          TransferCount = 0;
    }

否则,如果您在这种情况下重新启动计时器,它将立即停止

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

计时器事件未触发按钮单击

来自分类Dev

计时器滴答事件未触发

来自分类Dev

计时器滴答事件未触发

来自分类Dev

计时器滴答事件中的动态按钮单击事件

来自分类Dev

C#计时器事件未触发

来自分类Dev

jQuery设置事件触发计时器

来自分类Dev

无法触发事件(计时器)

来自分类Dev

jQuery设置事件触发计时器

来自分类Dev

QML 计时器未触发

来自分类Dev

空闲计时器未触发操作

来自分类Dev

单击按钮更改计时器时间

来自分类Dev

按钮单击事件未触发

来自分类Dev

按钮单击事件未触发

来自分类Dev

RxJS-使用RxJS时如何通过单击按钮使计时器触发?

来自分类Dev

基于Meteorjs计时器的事件触发器

来自分类Dev

基于Meteorjs计时器的事件触发器

来自分类Dev

试图阻止systemd计时器触发错过的事件

来自分类Dev

REST API触发Camunda计时器中间捕获事件

来自分类Dev

试图阻止systemd计时器触发错过的事件

来自分类Dev

jQuery按钮单击事件未触发

来自分类Dev

骨干js按钮单击事件未触发

来自分类Dev

单击时未触发angularjs按钮事件

来自分类Dev

Fragment 中未触发按钮单击事件

来自分类Dev

向后导航后,Swiftui计时器未触发

来自分类Dev

如何停止按钮单击所影响的计时器?

来自分类Dev

单击按钮时如何设置计时器?

来自分类Dev

按钮上的启动计时器快速单击

来自分类Dev

Tkinter 计时器在单击按钮时从 0 开始

来自分类Dev

单击按钮时如何添加秒表计时器?