[英]C# Invoking method by timer.Elapsed and by click
我的计时器有问题。
这是我的代码:
_uploadHelper = new DataProcessorUploadHelper((sender, args) => Start())
public void Start()
{
Task.Factory.StartNew(() =>
{
if (UploadHelper.UploadState == UploadState.UploadOn)
{
UploadHelper.IncrementSavingRequestCounter();
}
else
{
UploadHelper.StopTimer();
lock (_lock)
{
UploadHelper.UploadState = UploadState.UploadOn;
UploadData();
UploadHelper.UploadState = UploadState.UploadOff;
}
UploadHelper.StartTimer();
}
});
}
UploadState以这种方式实现
private int _uploadState;
public UploadState UploadState
{
get { return (UploadState)_uploadState; }
set { Interlocked.Exchange(ref _uploadState, (int)value); }
}
我正在使用System.Timers.Timer,它应该以10分钟的间隔调用Start方法(在我的助手类中实现)。
private Timer _intervalTimer;
private long _savingRequestsCounter;
public DataProcessorUploadHelper(ElapsedEventHandler callback)
{
UploadState = UploadState.UploadOff;;
_intervalTimer = new Timer();
_intervalTimer.Interval = UploadIntervalTimeSpan.TotalMilliseconds;
_intervalTimer.Elapsed += callback;
_intervalTimer.Start();
_intervalTimer.Enabled = true;
}
public void StartTimer()
{
_intervalTimer.Start();
}
public void ResetTimer()
{
_intervalTimer.Start();
_intervalTimer.Stop();
}
public void StopTimer()
{
_intervalTimer.Stop();
}
public void IncrementSavingRequestCounter()
{
Interlocked.Increment(ref _savingRequestsCounter);
}
public void DecrementSavingRequestCounter()
{
Interlocked.Decrement(ref _savingRequestsCounter);
}
当用户单击特定按钮时,也会调用此方法。
和我的麻烦。
计时器调用启动方法=> UploadHelper.UploadState = UploadState.UploadOn。
而且应该用_lock锁定。
但是,当用户在UploadData()期间单击时,我看到UploadState = UploadState.UploadOff并没有被锁定。
这段代码有什么问题?
为什么计时器调用此方法时状态不同?
“ ...而且应该用_lock锁定”
是的,如果您的情况下将_lock声明为static 。
由于Timer的Elapsed-Event会导致在单独的线程中调用UploadData(),因此_lock(如果不是静态的)每次都是不相同的_lock,因此不会用作同步对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.