仅使用委托和事件创建计时器winform应用程序[WITHOUT TIMER OBJECT]

时间:2015-09-28 17:42:38

标签: c# winforms events timer delegates

虽然使用定时器,秒表和线程是标准方法,我想知道是否有办法在c#中创建一个Winform应用程序,其初始值为0,并且一旦点击一个按钮就会自动保持递增当再次点击相同的按钮时,它应该暂停。就个人而言,我觉得诀窍是使用多播代理。但我不知道如何继续。

注意:可能使用方法回调和InvokeRequired()。

3 个答案:

答案 0 :(得分:0)

此代码不使用计时器或秒表。 我已经为你写了一个简单的课程,请原谅我,如果它不那么标准,因为我现在很懒:)

public partial class Form1 : Form
{

    CancellationTokenSource src;
    CancellationToken t;

    public Form1()
    {
        InitializeComponent();
    }

    //start incrementing
    private async void button1_Click(object sender, EventArgs e)
    {
        this.Start.Enabled = false;
        this.Cancel.Enabled = true;
        this.src = new CancellationTokenSource();
        this.t = this.src.Token;


        try
        {
            while (true)
            {
                var tsk = Task.Factory.StartNew<int>(() =>
                {
                    Task.Delay(500);
                    var txt = int.Parse(this.Display.Text) + 1;
                    return (txt);
                }, this.t);
                var result = await tsk;
                this.Display.Text = result.ToString();
            }

        }
        catch (Exception ex)
        {
            return;
        }
    }
    // Stop incrementing
    private void button1_Click_1(object sender, EventArgs e)
    {
        this.src.Cancel();
        this.Cancel.Enabled = true;
        this.Start.Enabled = true;
    }
}

答案 1 :(得分:0)

真的不确定为什么您认为可以通过适当的限制来完成此操作。如果你想在&#34;事件&#34;之间插入延迟,那么你需要使用某种计时器,或者某种线程(经典线程或某种任务)在其中有延迟......没办法解决这个问题。

这是另一种可能违反您的限制的方法:

public partial class Form1 : Form
{

    private Int64 value = -1;
    private bool Paused = true;
    private int IntervalInMilliseconds = 100;
    private System.Threading.ManualResetEvent mre = new System.Threading.ManualResetEvent(false);

    public Form1()
    {
        InitializeComponent();
        this.Shown += Form1_Shown;
    }

    private async void Form1_Shown(object sender, EventArgs e)
    {
        await Task.Run(delegate ()
        {
            while (true)
            {
                value++;
                label1.Invoke((MethodInvoker)delegate ()
                {
                    label1.Text = value.ToString();
                });
                System.Threading.Thread.Sleep(IntervalInMilliseconds);
                mre.WaitOne();
            }
        });
    }

    private void button1_Click(object sender, EventArgs e)
    {            
        if (Paused)
        {
            mre.Set();
        }
        else
        {
            mre.Reset();
        }
        Paused = !Paused;
    }

}

答案 2 :(得分:-2)

使用活动。

如果您不能使用计时器或线程,那么如何创建执行事件的do while循环。 一些PSEUDO代码如下 - 它应该给你一个想法..

bool IWantEvents = false;
public event EventHandler<myHandler> myNonTimerEvent ;

FormStart()
{
 this.myNonTimerEvent += new MyNonTimerEventHandler();
IWantEvents = true;
Do
{
.. do some weird stuff - set IWantEvents False on condition ..
}
while(IWantEvents)
}

MyNonTimerEventHandler()
{
.. Do what I would do if I was using a timer event.
}