Рейтинг:
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
Рейтинг:
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, сильно усложняет этот вопрос.