2

目前我正在从 java 迁移到 c#,而且我充满了疯狂的问题。我正在 Windows 窗体应用程序上尝试新事物,现在,我想创建一个循环,每 1 分钟执行一次代码,问题是我不知道将这段代码放在哪里。例如,表单结构如下:

using System;

namespace Tray_Icon
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            notifyIcon1.ShowBalloonTip(5000);


        }

        private void notifyIcon1_BalloonTipClicked(object sender, EventArgs e)
        {
            label1.Text = "Baloon clicked!";
        }

        private void notifyIcon1_BalloonTipClosed(object sender, EventArgs e)
        {
            label1.Text = "baloon closed!";
        }

        private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
        {

        }

        private void option1ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //some code here
        }

        private void option2ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //some code here
        }

        private void option3ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            label1.Text = "Option 3 clicked!";
        }

        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            option1ToolStripMenuItem_Click(this, null);
        }

        private void closeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnWrite_Click(object sender, EventArgs e)
        {
//code here

        }
    }
}

我应该把循环代码放在哪里?:(

提前感谢任何重播!!!

4

8 回答 8

8

在表单中添加计时器:

在此处输入图像描述

将其Interval属性设置为 60000(以毫秒为单位的一分钟)并Enabled设置为True

在此处输入图像描述

并将事件处理程序附加到Timer.Tick事件,例如通过双击表单设计器中的计时器:

private void timer1_Tick(object sender, EventArgs e)
{
    // do something here. It will be executed every 60 seconds
}
于 2012-07-16T07:51:39.467 回答
7

您必须添加一个计时器,并将间隔设置为 1000 毫秒,然后在 OnTick 事件中添加带有循环的代码

Timer tmr = null;
    private void StartTimer()
    {
       tmr = new Timer();
       tmr.Interval = 1000;
       tmr.Tick += new EventHandler<EventArgs>(tmr_Tick);
       tmr.Enabled = true;
    }

    void tmr_Tick(object sender, EventArgs e)
    {
        // Code with your loop here
    }
于 2012-07-16T07:51:35.927 回答
0

您不能在此处放置任何循环代码。

在您的设计器中查找Timer控件。当您拥有它时,将其配置为每分钟运行一次并将您的代码放入Timer_Tick事件中。

或者在代码中手动创建一个计时器并响应事件 :) 但是对于初学者来说,由设计师来做会更容易!

于 2012-07-16T07:52:50.317 回答
0

将 Timer 组件拖到 Form 上并双击它。你去那里的代码。

Timer 组件在主线程中运行,因此您可以修改 UI 组件而无需担心。

或者,您可以创建一个 System.Timers.Timer,它有自己的线程并具有一些优势,但在修改 UI 组件时可能需要注意。请参阅http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx

于 2012-07-16T07:54:11.293 回答
0

尝试使用Background Worker并将代码放在 backgroundWorker.DoWork 或使用 Timer

于 2012-07-16T07:54:18.407 回答
0

使用System.Timers.Timer

System.Timers.Timer aTimer;

{
    aTimer = new System.Timers.Timer();
    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    aTimer.Interval = 60000;
    aTimer.Enabled = true;
}

private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
    Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime);
}

要使用 Timer,请参阅本教程:C# Timer

于 2012-07-16T07:56:17.100 回答
0

你在Java平台上是怎么做的?

我认为Java应该与.net相同。
实际上,表单程序只是包含事件调度程序的普通程序。事件分派器侦听 UI 事件并将它们分派给事件处理程序。我认为所有的 UI 模式都应该这样,无论是 Java 还是 .net 平台。

所以一般来说,你有两个选择:

  1. 从头开始循环。在这种情况下,您应该在 Form 的构造函数中插入代码。
  2. 当用户单击按钮时开始循环。在这种情况下,您应该在事件处理函数中插入您的代码。

是的,正如其他人提到的,您应该使用计时器。但这应该在你知道你的代码应该放在哪里之后。您还可以在睡眠呼叫中使用无限循环。但是计时器是一个更好的解决方案。

于 2012-07-16T08:22:17.077 回答
0

计时器的想法更好。但是如果你想使用线程。然后按照这个

  1. 让我假设您想从程序开始就这样做
  2. 您可以在名为 Form1_Load 的函数体(实际上是事件)中编写为
  3. 您的实际代码就在while循环中,其他代码仅用于指导
  4. 如果您不知道 C# 中线程的使用,我可以指导

bool button2Clicked = false;
private void Form1_Load(object sender, EventArgs e)
{    
    // A good Way to call Thread
    System.Threading.Thread t1 = new System.Threading.Thread(delegate()
    {
       while (!button2Clicked)
       {
          // Do Any Stuff;
          System.Threading.Thread.Sleep(60000);  //60000 Millieconds=1M
       }
    });
    t1.IsBackground = true;  // With above statement Thread Will automatically
    // be Aborted on Application Exit
    t1.Start();
}
于 2012-07-16T08:23:43.993 回答