C # создать цикл таймера, который запускает код каждые 30 минут?

Я хотел бы ввести функцию автосохранения в свою программу на C #, которая будет запускать строку кода в конце обратного отсчета, а затем перезапускать обратный отсчет. Он запустит мою SaveFile(); функцию.

Я бы хотел, чтобы этот таймер запускался, когда пользователь впервые сохраняет / открывает документ, и отключал его, если они открывают новый документ.


person Toby    schedule 26.04.2013    source источник
comment
Таймер потребует много ресурсов, вы должны использовать BackgroundWorker или async в .NET 4.5.   -  person Herdo    schedule 26.04.2013
comment
Что вас смущает в обучающих материалах?   -  person proggrock    schedule 26.04.2013
comment
Просто вообще не понимаю, как заставить у меня работать. Как вы работаете с фоновыми работниками?   -  person Toby    schedule 26.04.2013
comment
@Herd: Как бы вы использовали BackgroundWorker в качестве таймера? Его код должен работать с интервалом, который имеет смысл для пользователя таймера. Но что касается сохранения файла, конечно, он может поместить его в другой поток, чтобы предотвратить зависание пользовательского интерфейса.   -  person PoweredByOrange    schedule 26.04.2013
comment
@Toby: Если вы используете .NET 4.0 или 4.5, тогда намного проще использовать Task.   -  person PoweredByOrange    schedule 26.04.2013
comment
@ programmer93: Я здесь немного запутался ... Извините, я только недавно начал программировать в рамках своего курса в колледже, так что не могли бы вы объяснить мне вещи простыми словами? Спасибо :)   -  person Toby    schedule 26.04.2013
comment
@ programmer93: я использую .NET 4.0   -  person Toby    schedule 26.04.2013
comment
@ programmer93 например например, this.   -  person Herdo    schedule 26.04.2013
comment
@Toby см. Ссылку выше. На мой взгляд, лучше использовать другой поток, который спит и занимает меньше памяти, чем таймер.   -  person Herdo    schedule 26.04.2013
comment
Хорошо. Я попробую разобраться, используя тот источник. Спасибо за ссылку.   -  person Toby    schedule 26.04.2013
comment
@Toby Единственный раз, когда вы используете BackgroundWorker, - это когда вы хотите выполнить асинхронную операцию И вы хотите получать уведомления о статусе этой операции по мере ее выполнения. Например, если вы хотите загрузить файл и хотите, чтобы индикатор выполнения обновлялся в зависимости от количества загруженных байтов. Мне кажется, что в вашем случае имеет смысл просто поместить ваш Save метод в Task (который на самом деле представляет собой две строки кода) и выполнить его в другом потоке. Взгляните на это.   -  person PoweredByOrange    schedule 26.04.2013


Ответы (4)


Вы можете использовать прошедшее событие в системе .Timers Таймер.

Timer timer = new Timer(30 * 60 * 1000);
timer.Elapsed += OnTick; // Which can also be written as += new ElapsedEventHandler(OnTick);


private void OnTick(object source, ElapsedEventArgs e)
{ 
    //Save logic
}

И не забывайте звонить timer.Start(), когда вам это нужно.

person Pierre-Luc Pineault    schedule 26.04.2013
comment
timer.Enabled = true является обязательным. - person lsalamon; 01.07.2014
comment
@Isalamon На самом деле, если вы запускаете таймер (timer.Start();), вам не нужно явно устанавливать для Enabled значение true. И я только что увидел, что написал всю new ElapsedEventHandler декларацию, которая бесполезна, timer.Elapsed += OnTick; намного чище. - person Pierre-Luc Pineault; 01.07.2014

Вы также можете использовать DispatchTimer. Вот фрагмент, который воспроизводит одно из пяти разных видео каждые 5 минут.

        DispatcherTimer mediaTimer = new DispatcherTimer();
        mediaTimer.Interval = TimeSpan.FromMinutes(5);
        mediaTimer.Tick += new EventHandler(mediaTimer_Tick);
        mediaTimer.Start();

    void mediaTimer_Tick(object sender, EventArgs e)
    {
        nextMovie();
    }

    public void nextMovie()
    {
        if (mediaIndex >= 5)
            mediaIndex = 0;

        switch (mediaIndex)
        {
            case 0:
                mediaElement1.Source = new Uri(videoFileName1, UriKind.Absolute);
                break;
            case 1:
                mediaElement1.Source = new Uri(videoFileName2, UriKind.Absolute);
                break;
            case 2:
                mediaElement1.Source = new Uri(videoFileName3, UriKind.Absolute);
                break;
            case 3:
                mediaElement1.Source = new Uri(videoFileName4, UriKind.Absolute);
                break;
            case 4:
                mediaElement1.Source = new Uri(videoFileName5, UriKind.Absolute);
                break;
            default:
                mediaElement1.Source = new Uri(videoFileName1, UriKind.Absolute);
                break;

        }

        mediaElement1.Visibility = System.Windows.Visibility.Visible;
        mediaIndex++;
        mediaElement1.Play();
    }
person Geoff Murtaugh    schedule 26.04.2013
comment
Если вы используете Windows.UI.Xaml (последний выпуск: апрель 2010 г.), это хороший ответ. - person Dustin_00; 27.08.2018

Вы можете использовать System.Timers.Timer. В нем также есть методы Stop и Start, поэтому вы можете делать все, что захотите.

System.Timers.Timer myTimer = new Timer(30 * 60 * 1000);
myTimer.Start();
myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed);


void myTimer_Elapsed(object sender, ElapsedEventArgs e)
{
    //your code
}
person Hossein Narimani Rad    schedule 26.04.2013

Открытие нового окна

 FrmCupsToOunces MyNewForm = new FrmCupsToOunces();
        MyNewForm.Show();

Создание массива

const int QUARTERS = 4;
        const int DIVISIONS = 3;

        double[,] stats = new double[DIVISIONS, QUARTERS];

Проверка пароля

int InNumTry = 0;
    private void BtnGo_Click_1(object sender, EventArgs e)
    {
        string password;
        password = TxtIn.Text;

            switch (password)
            {
                case " ": MessageBox.Show("Passowrd is empty.");
                    break;

                case "MIKE": MessageBox.Show("Password is OK!");
                    FrmBOO newForm = new FrmBOO();
                    newForm.Show();
                    break;

                default:
                    InNumTry++;
                    MessageBox.Show("Invalid Passwrod, try again!");
                    TxtIn.Text = "";
                    TxtIn.Focus();
                    break;
            }

Проверить длину

LblLength.Text = TxtInput.Text.Length.ToString();

Сделать вверх

LblUpper.Text = TxtInput.Text.ToUpper();

Сделать для уменьшения

LblLower.Text = TxtInput.Text.ToLower();

Последние правые три

LblRight.Text = TxtInput.Text.Substring(TxtInput.Text.Length - 3);

Показать средние символы

LblSubscript.Text = TxtInput.Text.Substring(1, 3);

ASCII

private void btnascii_Click(object sender, EventArgs e)
    {
        string assqui;
        int num;
        num = Convert.ToInt32(txtinput.Text);
        assqui = char.ConvertFromUtf32(num);
        lblascii.Text = assqui.ToString();
    }

ПРЕОБРАЗОВАТЬ ХАРАКТЕР В ASCII

        string assqui;
        int num;
        num = Convert.ToInt32(textBox1.Text);
        assqui= char.ConvertFromUtf32(num);
        lblout.Text = assqui.ToString();

Показать разницу

 string name;
        name = txtinput.Text;
        foreach (char letter in name)
        {
            MessageBox.Show(letter.ToString());
        }

Получить файл

private void BtnGetFile_Click(object sender, EventArgs e)
    {
        string Line;
        int count = 0;

        try
        {
            StreamReader ReadFile;

            StringFileName = Interaction.InputBox(" Please Enter Your Desired File Name \n You do not need to place the '.txt' at the end of the file name.") + ".txt";

            ReadFile = File.OpenText(StringFileName);

            LbSongs.Items.Clear();

            while (!ReadFile.EndOfStream)
            {
                Line = ReadFile.ReadLine();
                string[] words = Line.Split(',');

                ListSongs[count].NameOfSong = words[0];
                ListSongs[count].NameOfArtist = words[1];
                ListSongs[count].NameOfFile = words[2];
                ListSongs[count].ThisWeekRank = words[3];
                ListSongs[count].MostWeekRank = words[4];
                ListSongs[count].LastWeekRank = words[5];

                LbSongs.Items.Add(ListSongs[count].NameOfSong);

                count++;
            }

            LbSongs.SelectedIndex = 0;
            Show();
            ReadFile.Close();
        }
        catch
        {
            MessageBox.Show("The file you are trying to access either, can not be found or opened");
        }

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

    private void infoToolStripMenuItem_Click(object sender, EventArgs e)
    {
        MessageBox.Show("The Program was created by Konrad Lazarek.\n\nOn April 16st, 2014.\n\nVersion: 00:03:48:59",
        "Info On This Program",
        MessageBoxButtons.OK,
        MessageBoxIcon.Information,
        MessageBoxDefaultButton.Button1);
    }

    private void BTF(int index)
    {
        switch (ListSongs[index].NameOfSong)
        {
            case "Happy":
                HidePictures();
                PicHappy.Visible = true;
                break;
            case "All Of Me":
                HidePictures();
                PicAllOfMe.Visible = true;
                break;
            case "Dark Horse":
                HidePictures();
                PicDarkHorse.Visible = true;
                break;
            case "Talk Dirty":
                HidePictures();
                PicTalkDirty.Visible = true;
                break;
            case "Let It Go":
                HidePictures();
                PicLetItGo.Visible = true;
                break;
            case "Pompeii":
                HidePictures();
                PicPompeii.Visible = true;
                break;
            case "Team":
                HidePictures();
                PicTeam.Visible = true;
                break;
            case "Counting Stars":
                HidePictures();
                PicCountingStars.Visible = true;
                break;
            case "The Man":
                HidePictures();
                PicTheMan.Visible = true;
                break;
            case "Turn Down For What":
                HidePictures();
                PicTurnDownForWhat.Visible = true;
                break;
        }
    }

private void LbSongs_SelectedIndexChanged(object sender, EventArgs e)
        {
            IntSelInd = LbSongs.SelectedIndex;

            LblThisWeek.Text = ListSongs[IntSelInd].LastWeekRank;
            LblMostWeek.Text = ListSongs[IntSelInd].MostWeekRank;
            LblLastWeek.Text = ListSongs[IntSelInd].LastWeekRank;
            LblArtist.Text = ListSongs[IntSelInd].NameOfArtist;

            BTF(IntSelInd);

            axWindowsMediaPlayer1.URL = @ListSongs[IntSelInd].NameOfFile;
        }

Таймер (Добавить [timer1.Start ();] в загрузке Frm)

DateTime datetime = DateTime.Now;
        this.LblTime.Text = datetime.ToString();
person Dave    schedule 06.05.2014
comment
Я не понимаю, как это отвечает на вопрос на каком-либо уровне. - person The amateur programmer; 06.05.2016
comment
Спасибо за ответ. Но не понимаю. - person Agus Sapurta Sijabat; 03.08.2017