虽然使用定时器,秒表和线程是标准方法,我想知道是否有办法在c#中创建一个Winform应用程序,其初始值为0,并且一旦点击一个按钮就会自动保持递增当再次点击相同的按钮时,它应该暂停。就个人而言,我觉得诀窍是使用多播代理。但我不知道如何继续。
注意:可能使用方法回调和InvokeRequired()。
答案 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.
}