繁体   English   中英

按计时器的C#调用方法

[英]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并没有被锁定。

这段代码有什么问题?

为什么计时器调用此方法时状态不同?

  1. “ ...而且应该用_lock锁定”

是的,如果您的情况下将_lock声明为static

由于Timer的Elapsed-Event会导致在单独的线程中调用UploadData(),因此_lock(如果不是静态的)每次都是不相同的_lock,因此不会用作同步对象。

  1. 如果您的计时器来自System.Timers ,那么还有另一种同步方式:请参见SynchronizingObject

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM