c# - 当每分钟尝试调用方法时,它只调用了两次
问题描述
当我调用ScheduleBackUp()
该form_load
方法时,只执行两次!
这是我的课:
class BackupDBs : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private readonly object _lock = new object();
private int _state = -1;
string nameBackupFolder;
public void ScheduleBackUp()
{
var startTimeSpan = TimeSpan.Zero;
var periodTimeSpan = TimeSpan.FromMinutes(1);
var timer = new System.Threading.Timer((e) =>
{
DoBackup();
}, null, startTimeSpan, periodTimeSpan);
}
public int MyState
{
get
{
return _state;
}
set
{
lock (_lock)
{
if (value != _state)
{
_state = value;
NotifyStateChanged("MyState");
}
}
}
}
private void NotifyStateChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public void DoBackup()
{
MyState = 0;
try
{
MyState = 1;
MyState = 2;
CreateBackupFolder();
}
catch
{
MyState = 3;
return;
}
try
{
var con = new MainCon();
con.sqlQuery("BACKUP DATABASE [" + DataCenter.DEFAULT_DB_NAME + "] TO DISK='" + nameBackupFolder + "\\" + DataCenter.DEFAULT_DB_NAME + "-" + DateTime.Now.ToString("yyyy-MM-dd--HH-mm-ss") + ".bak'");
con.nonQueryEx();
con.closecon();
MyState = 4;
}
catch
{
MyState = 5;
}
}
public void CreateBackupFolder()
{
//couz we need create to each DB special folder so we need to get the descr of default DB
string desc = DataCenter.DEFAULT_DB_DESCRIPTION;
//Get the default path for backup
string pathBackup = DataCenter.BACKUP_PATH;
//Preaper the name for our folder
nameBackupFolder = pathBackup + @"\" + "backup for " + desc;
// Create a new target folder, if not exists.
if (!System.IO.Directory.Exists(nameBackupFolder))
{
System.IO.Directory.CreateDirectory(nameBackupFolder);
}
}
我用它来调用方法:
private Classes.BackupDBs budb = new Classes.BackupDBs();
budb.ScheduleBackUp();
只发生了两次成功的备份,然后什么也没发生。请问我错过了什么?
解决方案
您只需将声明timer
向上移动到您的表单字段,因此它不会超出范围并被回收。
您的字段应如下所示:
public event PropertyChangedEventHandler PropertyChanged;
private readonly object _lock = new object();
private int _state = -1;
string nameBackupFolder;
System.Threading.Timer timer;
现在在 中ScheduleBackup()
,执行:
timer = new System.Threading.Timer((e) =>
{
DoBackup();
}, null, startTimeSpan, periodTimeSpan);
现在它将永远有效。
推荐阅读
- javascript - 如何使用 PHP 或 JS 从 cookie 字符串中获取特定值?
- html - IE 11 不关注跨度与 tabindex
- javascript - javascript如何通过两条规则对对象数组进行排序?
- excel - 将 VBA 用户窗体中的数据保存到两个工作表中
- eclipse - Photon Eclipse JEE 无法启动
- sql - 如何按条件连接表
- javascript - 为什么javascript不能在共享/部分视图的asp.net mvc视图中工作
- noise - MDS 绘图轴与信噪比有何关系?
- jquery - 无法将背景图像属性设置为无
- javascript - 如何在函数内停止 Ajax 调用