Рейтинг:
5
F-ES Sitecore
В дополнение к решению 1 Вы можете вести список домашних животных вместо того чтобы работать только с одним
public class Pet
{
public string Name { get; set; }
public int Hunger { get; private set; }
public bool IsAlive { get; private set; }
public Pet(string name)
{
Name = name;
Hunger = 100;
IsAlive = true;
}
public void SetHunger(int _hunger)
{
Hunger = Hunger - _hunger;
if (Hunger <= 0)
{
IsAlive = false;
}
}
}
private static List<Pet> pets = new List<Pet>();
static void Main(string[] args)
{
var myTimer = new System.Timers.Timer();
myTimer.Elapsed += new ElapsedEventHandler(DisplayTimeEvent);
myTimer.Interval = 2000;
myTimer.Start();
string line;
// Type a pet name followed by [RETURN] to create a pet of that name
while ((line = Console.ReadLine()) != "q")
{
Pet pet = CreatePet(line);
// you can do something with pet here if you want
}
}
public static Pet CreatePet(string name)
{
Pet pet = new Pet (name);
pets.Add(pet);
return pet;
}
public static void DisplayTimeEvent(object source, ElapsedEventArgs e)
{
foreach (Pet pet in pets)
{
pet.SetHunger(10);
if (pet.IsAlive)
{
Console.WriteLine("Pet:{0} Hunger:{1}", pet.Name, pet.Hunger);
}
else
{
Console.WriteLine("{0} died", pet.Name);
}
}
pets.RemoveAll(p => p.IsAlive == false);
}
Member 13189777
Он идеально подходит именно так, как я хотел. Единственное что я получаю это описание кода серьезности ошибки состояние подавления строки файла проекта
Ошибка CS0123 нет перегрузки для' DisplayTimeEvent 'соответствует делегату 'ElapsedEventHandler'
в этой строке -- & gt; new ElapsedEventHandler(DisplayTimeEvent);
например, выглядит так
также mytimer.Elapsed += new ElapsedEventHandler(DisplayTimeEvent);
F-ES Sitecore
Этот код работает нормально для версии .net, которую я использую (4.5), возможно, вам придется обратиться к документам для вашей версии и настроить их по мере необходимости, или просто попробовать
также mytimer.Прошедшее Время += DisplayTimeEvent;
или тип
также mytimer.Истекший +=
в visual studio нажмите TAB и он создаст правильную сигнатуру метода для вас
Member 13189777
Хммм... когда я нажимаю TAB, он делает эту подпись...
частных статических недействительным MyTimer_Elapsed1(объект отправителя, ElapsedEventArgs е)
я положил это
{
по каждому элементу (любимчика любимчика домашних животных)
{
домашнее животное.Сетхангер (10);
если (пет.Isalive в)
{
Приставка.WriteLine ("Pet: {0} Hunger:{1}", pet.Name, домашнее животное.Голод);
}
еще
{
Приставка.WriteLine ("{0} умер", pet.Name);
}
}
домашние животные.Метод removeall(Р =&ГТ; п.Очередь isalive == ложь);
}
Это не работает :(
F-ES Sitecore
Обновите свой исходный вопрос, чтобы перечислить весь код, который вы используете в данный момент.
Member 13189777
использование системы;
использование системы.Коллекции.Общий;
использование System. Linq;
используя системы.Текст;
пространство имен ConsoleApptimertest2
{
домашнее животное класса
{
public string Name { get; set; }
public int Hunger { get; private set; }
public bool IsAlive { get; private set; }
публичный питомец(строковое имя)
{
Имя name;
Голод = 100;
IsAlive = true;
}
общественного недействительными SetHunger(инт _hunger)
{
Голод = Голод-_hunger;
если (голод <= 0)
{
IsAlive = false;
}
}
}
}
использование системы;
использование системы.Коллекции.Общий;
использование System. Linq;
используя системы.Текст;
использование системы.Таймеры;
пространство имен ConsoleApptimertest2
{
программа занятий
{
частная статический список<любимчика&ГТ; домашние животные = новый список<любимчика&ГТ;();
static void Main (string[] args)
{
var myTimer = новая система.Таймеры.Таймер();
также mytimer.Elapsed += new ElapsedEventHandler(DisplayTimeEvent);
также mytimer.Интервал = 2000;
также mytimer.Начать();
строки;
// Введите имя питомца, а затем [RETURN], чтобы создать питомца с таким именем
while ((line = Console.ReadLine ())! = " q")
{
Домашнее животное домашнее животное = CreatePet(линия);
// вы можете сделать что-то с домашним животным здесь, Если хотите
}
}
частных статических недействительным MyTimer_Elapsed1(объект отправителя, ElapsedEventArgs е)
{
по каждому элементу (любимчика любимчика домашних животных)
{
домашнее животное.Сетхангер (10);
если (пет.Isalive в)
{
Приставка.WriteLine ("Pet: {0} Hunger:{1}", pet.Name, домашнее животное.Голод);
}
еще
{
Приставка.WriteLine ("{0} умер", pet.Name);
}
}
домашние животные.Метод removeall(Р =&ГТ; п.Очередь isalive == ложь);
}
public static Pet CreatePet(строковое имя)
{
Pet pet = новый питомец (имя);
домашние животные.Добавить (домашнее животное);
возвращение питомца;
}
общественная статический недействительным DisplayTimeEvent(источник, объект, ElapsedEventHandler е)
{
Приставка.WriteLine ("hej");
Приставка.Линия чтения();
по каждому элементу (любимчика любимчика домашних животных)
{
домашнее животное.Сетхангер (10);
если (пет.Isalive в)
{
Приставка.WriteLine ("Pet: {0} Hunger:{1}", pet.Name, домашнее животное.Голод);
}
еще
{
Приставка.WriteLine ("{0} умер", pet.Name);
}
}
домашние животные.Метод removeall(Р =&ГТ; п.Очередь isalive == ложь);
}
}
}
Member 13189777
Я взял код из метода public static void DisplayTimeEvent(object source, ElapsedEventHandler e)
и скопировал его на старый метод, и теперь он работает идеально, спасибо лояльным ребятам!!!
Рейтинг:
15
jimmson
Здравствуйте, да, есть способ, с помощью таймеров.
В C# есть несколько классов таймеров, лучше всего посмотреть на все из них и выбрать тот, который соответствует вашим потребностям!
Все вокруг .Чистые таймеры-сравнение[^]
Обновление:
private static Pet vov;
static void Main(string[] args)
{
vov = new Pet();
var myTimer = new System.Timers.Timer();
myTimer.Elapsed += new ElapsedEventHandler(DisplayTimeEvent);
myTimer.Interval = 1000;
myTimer.Start();
while (Console.Read() != 'q')
{
}
Console.ReadKey();
}
public static void DisplayTimeEvent(object source, ElapsedEventArgs e)
{
vov.SetHunger(10);
Console.Write("\r{0}", DateTime.Now);
}
Member 13189777
Но я понятия не имею, как это сделать... я новичок, и я пытался сделать то, что вы говорите раньше, и я не понимаю, как сделать метод потока для обновления экземпляра pet.
jimmson
Вы можете хранить экземпляр pet в каком-то частном поле. Затем получите доступ к нему из метода обратного вызова потока и вызовите SetHunger. Покажите мне код, который вы пробовали, чтобы я мог помочь вам с ним.
Member 13189777
static void Main(string[] args)
{
pet Vov = new pet();
Timer myTimer = new Timer();
myTimer.Elapsed += new ElapsedEventHandler(DisplayTimeEvent);
myTimer.Interval = 1000;
myTimer.Start();
while (Console.Read() != 'q')
{
}
}
public static void DisplayTimeEvent(object source, ElapsedEventArgs e)
{
Console.Write("\r{0}", DateTime.Now);
}
Это код, который я сделал, но я вообще не знаю, как это сделать... Я в тупике..
jimmson
Я обновил свой ответ кодом.
Member 13189777
спасибо, но я не могу "увидеть Вову в методе DisplayTimeEvent?
Я получаю эту ошибку...
я не видел
частный статический питомец ВОВ;
но когда я добавляю его, я получаю
CS0246 C# не удалось найти тип или имя пространства имен (отсутствует ли директива using или ссылка на сборку?)
jimmson
Вы скопировали "private static Pet vov;" с самого начала моего кода? Я протестировал код (и отладил), и он работает.
Member 13189777
где я могу поместить частного статического питомца vov;?
Member 13189777
Я все исправил ... Кажется, это работает!! Спасибо!!
jimmson
Пожалуйста! Счастливого коддинга.
Member 13189777
Извините, я получаю ошибку при запуске кода
он говорит System. NullReferenceException: 'ссылка на объект не установлена на экземпляр объекта.' в этой строке - - - - > vov. SetHunger(10);
Я понятия не имею почему
jimmson
Вы, наверное, что-то изменили.
Member 13189777
да, я исправил это, так что код работает сейчас, но он не обновляет поле голода. он просто открывает окно, показывающее время. это время обновления, но ничего не могу поделать я пытался поставить ВОВ.ShowHunger(); ( новый метод, я добавил.) но DisplayTimeEvent выброшены голода или показать его.
jimmson
Программирование - это решение проблем. Если вы собираетесь удалять мой ответ как решение каждый раз, когда вы нарушаете свой код, я не думаю, что этот разговор действительно куда-то идет.