TimGMitch Ответов: 7

Таймер.ТИК не признали


С помощью приведенного ниже кода я получаю сообщение об ошибке: "система.Таймеры.Таймер не содержит определения термина "ТИК"..."

Что я упускаю?



using System;
using System.Timers;
namespace AutoCloseMessageBox1
{
    public partial class Form1 : Form
    {
        private FakeMessageBox box;
        private void Form1_Load( object sender, EventArgs e )
        {
            box = new FakeMessageBox();
            box.Show();
            Timer autoCloseTimer = new Timer();
            autoCloseTimer.Interval = 3000;
            autoCloseTimer.Enabled = true;
            autoCloseTimer.Tick += new EventHandler(autoCloseTimer_Tick);
        }
        void autoCloseTimer_Tick(object sender, EventArgs e)
        {
            box.Close();
        }
    }
}

7 Ответов

Рейтинг:
58

Mehdi Gholam

System.Timers.Timer не имеет Tick но имеет Elapsed событие.

Вам действительно следует больше использовать intellisense.


ARBebopKid

"Вам действительно следует больше использовать intellisense."

Аминь!

Mehdi Gholam

Аллилуйя, брат!

Sergey Alexandrovich Kryukov

Правильно, 5, но что делать? Не все так просто. Пожалуйста, смотрите полный код в моем решении.
--СА

Simon Bang Terkildsen

Мой 5.
Вам действительно следует больше использовать intellisense.
очень верно, хотя иногда это может чувствовать себя немного больше как stupidsense/dumbsense/что-у-Ф***-были-интернет-разработчиков-мышление-чувство. Это, вероятно, звучит слишком грубо, и я скоро могу простить и забыть, просто у меня был такой плохой опыт с этим сегодня. Сначала это заняло целую вечность, примерно 5-10 секунд!! А потом он начал показывать intellisense для неправильных типов (все еще принимая навсегда)!! а потом вдруг VS просто разбивался каждый раз, когда открывалось всплывающее окно.. reintall VS; ( . Единственная работа, которую я сделал сегодня, - это небольшое исправление ошибки:
if(!pointer) pointer->DoSomthing();
Все, что я сделал сегодня, это удалил чертову штуку. !, ГРР.

Mehdi Gholam

В такие моменты вам нужен перерыв, вам нужен К...К...!

navyjax2

@Mehdi и другие, и я знаю, что опаздываю на вечеринку, но думаю, мне нужно напомнить моим коллегам-разработчикам, что такие слова, как «используйте intellisense больше», не всегда кому-то помогут. Я думаю, он видел там, как он не мог использовать Tick, иначе он бы не опубликовал вопрос. Это не означает, что вы автоматически, путем осмоса или деривации, можете каким-то образом автоматически узнать, какой выбор в intellisense является фактическим правильным событием. Когда я впервые увидел "Elapsed", я подумал, что это способ установить, что таймер достиг своего интервала, вручную, а не как способ заставить его фактически выполнять свою работу, которую он обычно делал бы с каждым интервалом, например Tick делает. Не думайте, что все думают так, как знают, или умеют делать выводы так же хорошо, как вы. Да, он мог бы пойти в MSDN, чтобы узнать, что у него есть, но он не всегда регистрирует, что что-то должно быть «этим», и обычно существует множество различных свойств и событий для работы, а поиск в MSDN может всегда дают вам неправильный таймер для вашего проекта, так как у них их 3 (System.Windows.Forms, System.Threading, System.Timers).

Рейтинг:
51

Sergey Alexandrovich Kryukov

Вот точный код:

//replace your line with "Tick +=" with:
autoCloseTimer.Elapsed += (sender, eventArgs) => {
    this.Invoke(new System.Action<System.Windows.Forms.Form>((param) => { param.Close(); }), box);
};


Вызов Invoke должен выполняться на любом элементе управления, фактически работающем в вашем пользовательском интерфейсе; в вашем случае это ваша форма, на которую ссылается параметр "this".

Если по какой-то причине вы используете C# V. 2, вы должны добавить объявление Action и замените лямбда-синтаксис анонимным синтаксисом делегата без вывода типа:

delegate void Action(System.Windows.Forms.Form box);
void CloseBox(System.Windows.Forms.Form box) { box.Close();}

//...

autoCloseTimer.Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs eventArgs) {
    this.Invoke(new Action(CloseBox), box);
};


Я предположил box это тоже форма. Если нет, просто замените его тип на правильный. Action и CloseBox.

—СА


Mehdi Gholam

Мастер за работой! 5!

Sergey Alexandrovich Kryukov

Ух ты! Звучит лестно. Спасибо, Мехди.
--СА

Simon Bang Terkildsen

Да, не повышайте уверенность СА до такой степени :П. Я все еще слежу за ответом, который могу проголосовать: P, хотя был активен здесь уже 2 месяца и до сих пор не нашел ни одного XD

Sergey Alexandrovich Kryukov

Большое спасибо за эту записку, Саймон.

Я надеюсь, что высокие голоса не повлияют на мою уверенность, но я был бы очень благодарен, если бы вы поймали меня на ошибке или предложили какой-либо другой вид обоснованной критики (не обязательно конструктивной). Одна из таких вещей произошла недавно; это была моя ошибка, повторенная в нескольких ответах, поэтому я был очень рад получить изменение, чтобы исправить себя.

Критика - это самый ценный вклад и движущая сила в нашей работе. Мне жаль, что я вижу здесь так много людей, которые воспринимают критику как оскорбление. Я очень мало надеюсь на таких людей и не могу понять, как они могут развивать свое мастерство с таким отношением.

--СА

navyjax2

Я оценил это на «1», так как это сильно усложняет ситуацию. Вам не нужны делегаты и операторы вызова, а также синтаксис Invoke с его «новым действием» this и его «=> {}», которое очень сложно и абстрактно. Это не нужно для такого простого действия, которое можно вызвать напрямую, как это делал исходный плакат. И ни одна из этих причуд не имела ничего общего с таймерами, за исключением демонстрации того, как вы можете добавить делегата в качестве обработчика событий таймера - что могло быть слишком продвинутым, учитывая, что это не норма. Обычно мы просто вызываем функцию и заставляем ее выполнять свою работу. Непоказание нормального способа работы усложняет работу новичка, с тех пор все ребята, читающие этот пост, начинают использовать делегатов, в то время как все ребята из колледжа используют ElapsedEventHandler и не имеют ни малейшего представления о том, что происходит ...

Simon Bang Terkildsen

Мои 5 за то, что показали, как на самом деле использовать System.Timers.Timer

Sergey Alexandrovich Kryukov

- Спасибо, Саймон.
--СА

TimGMitch

SA-спасибо вам за ваши смелые попытки помочь этому новичку C#. Я попытался реализовать ваше предложение кода, и теперь мой код выглядит следующим образом:

Таймер autoCloseTimer = новый таймер();
автоклозетимер.Интервал = 3000;
автоклозетимер.Включен = истина;
автоклозетимер.Истекло + = (отправитель, eventArgs) =>
{
этот.Invoke (новая система.Действие<system.windows.forms.form>((FakeMessageBox) = & gt; { FakeMessageBox.Закрытый ящик);
};

Теперь у меня есть ошибки с "отправителем "и " этим".Вызовите " заявление.

phil.o

Метод Close класса FakeMessageBox, конечно же, не является статическим.
Поэтому вы должны придерживаться синтаксиса, который был дан ; то есть: это.Invoke (новая система.\Действий&ЛТ;fakemessagebox\&ГТ;((ФМБ) =&ГТ; {ФМБ.Закрыть();}), коробка);

Sergey Alexandrovich Kryukov

Неправильный. Метод может быть экземплярным (нестатическим). Действие должно быть делегировано: где оно объявлено? Или это должно быть действие "тип". - Где он?
--СА

Sergey Alexandrovich Kryukov

Неправильный. Пожалуйста, ознакомьтесь с моим комментарием ниже и прочитайте мой пример кода более подробно. В неродовом синтаксисе я объявил действие выше. А ты?
--СА

Рейтинг:
43

ARBebopKid

Система.Таймеры.Таймер не имеет свойства Tick.

Но Система.Окна.Формы.Таймер знает.

Вы используете неправильный таймер.

:)


Mehdi Gholam

Только что выложил то же самое, мой 5!

Sergey Alexandrovich Kryukov

Нет, чаще всего System.Windows.Forms.Timer это неправильный таймер (проще, но очень плохая точность), поэтому метод неправильный.
Пожалуйста, посмотрите мое решение.
--СА

Simon Bang Terkildsen

мой 5, хотя я согласен с SA, что вы в основном хотели бы использовать System.Timers.Timer Но я думаю, что вы имеете в виду неправильно в том смысле, что ОП думал, что он использует System.Windows.Forms.Timer

Рейтинг:
2

Ian Shlasko

Я предполагаю, что вы переключились с другого типа таймера... Этот конкретный человек называет событие, которое вы ищете, " прошедшим"


Рейтинг:
1

devildx2050

Система.Таймеры.Таймер не имеет Тика событий...


Рейтинг:
1

srikanthgaddala

Привет,
Я думаю, что сначала вы должны запустить таймер с помощью метода start....


Рейтинг:
0

navyjax2

Просто измените все тики на истекшие и добавьте a. Start():

using System;
using System.Timers;
namespace AutoCloseMessageBox1
{
    public partial class Form1 : Form
    {
        private FakeMessageBox box;
        private void Form1_Load( object sender, EventArgs e )
        {
            box = new FakeMessageBox();
            box.Show();
            Timer autoCloseTimer = new Timer();
            autoCloseTimer.Interval = 3000;
            autoCloseTimer.Enabled = true;
            autoCloseTimer.Elapsed += new ElapsedEventHandler(autoCloseTimer_Elapsed);

            autoCloseTimer.Start();
        }
        void autoCloseTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            box.Close();
        }
    }
}


Patrice T

5 лет слишком поздно.
Прекратите публиковать решения на 5-летний вопрос, на который уже есть ответ.

navyjax2

Было бы, если бы любой из ответов действительно мог кому-то помочь. Говоря: "добавь .Start () " или "таймер не имеет тиковых событий" не отвечают на этот вопрос. Если бы я впервые пришел на таймеры, я бы не знал, что, черт возьми, происходит без примера, и поскольку Google привел меня сюда, казалось, что пример был лучшим способом передать то, что было необходимо, чем куча утверждений "сделай это" или "не делай этого", которые эти вопросы, похоже, получают ленивые ответчики. И один из самых рейтинговых ответов (№6), с его делегатами и заявлениями Invoke, сильно усложняет этот вопрос.