Если мы запустим программу, она вылетит и скажет «Не отвечает». Как это предотвратить. Я хочу, чтобы программа проверила себя, и если она не отвечает, перезапустите себя.
Замечания:
Мы можем использовать класс BackgroundWorker. как это:
private readonly BackgroundWorker worker; public Form1()
Но в этом классе нет метода, свойства или события, чтобы понять, что он не отвечает. Любая помощь будет оценена.
private readonly BackgroundWorker _Worker; public Form1() < InitializeComponent(); _Worker = new BackgroundWorker(); _Worker.DoWork += new DoWorkEventHandler(_Worker_DoWork); _Worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_Worker_RunWorkerCompleted); _Worker.WorkerReportsProgress = true; _Worker.WorkerSupportsCancellation = true; >// BCW starts here. private void button1_Click(object sender, EventArgs e) < _Worker.RunWorkerAsync(); while (true) ; >// ThreadTimer will run here. void _Worker_DoWork(object sender, DoWorkEventArgs e) < if (_Worker.IsBusy == true) < if (_Worker.CancellationPending) < e.Cancel = true; >TimerCallback tmrCallBack = new TimerCallback(CheckStatusThreadHealth); System.Threading.Timer tmr = new System.Threading.Timer(tmrCallBack, null, 10000, 10000); > > // This will call by ThreadTimer and check processes for not responding public void CheckStatusThreadHealth(object IsBusy) < Process application = null; foreach (var process in Process.GetProcesses()) < if (process.ProcessName == «WindowsFormsApplication1») < application = process; break; >> if (!application.Responding) < // This should end BCW and go to _Worker_RunWorkerCompleted. But it didn’t _Worker.CancelAsync(); // This Restart program but did not close the last one. Application.Restart(); >> // this should run when BCW has error or cancel, But never this happen void _Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) < Application.Restart(); return; >>
Ответ: благодаря Джейсону Уильямсу
DNS сервер не отвечает в Windows 10, 8, 7. Решение!!!
Я использовал программу сторожевого пса в качестве решения и связался между двумя программами по этой ссылке. Код изменен на этот:
В основной программе
public partial class Form1 : Form < // Use SendMessage API [DllImport(«user32.dll», CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SendMessage(IntPtr hwnd, uint Msg, IntPtr wParam, IntPtr lParam); // define a message private const int RF_TESTMESSAGE = 0xA123; // The timer will begin with the form public Form1() < InitializeComponent(); var timer = new Timer(); timer.Tick += new EventHandler(timer_Tick); timer.Interval = 10000; //10 seconds timer.Start(); >//Timer look for a Watch Dog Program and send message to it void timer_Tick(object sender, EventArgs e) < try < Process WatchDogProccess = Process.GetProcessesByName(«Watch Dog»)[0]; SendMessage(WatchDogProccess.MainWindowHandle, RF_TESTMESSAGE, IntPtr.Zero, IntPtr.Zero); >catch < //if Watch Dog is not running, will reach here >> // if we click this button we will got «Not Responding» private void button1_Click(object sender, EventArgs e) < while (true) ; >>
В программе сторожевых собак
Приложение не отвечает — фризит лагает CS:GO
Источник: stackru.com
Программа «Не отвечает» — C#
Программа выполняет сложные расчеты в одном методе. После 10секунд благополучного(по прогресбару) выполнения программа зависает секунд на 20(в заголовке «Не отвечает», ждущий курсор. кстати аналогично если я нажимаю просто на форму), а после отвисает. и прогресбар мгновенно заполняется на 100%. результаты ее работы все есть. очевидно что она просто долго думает. пробовал делать в новом потоке(смотрел тут http://www.cyberforum.ru/csharp-begi. ml#post1127690). результата ноль. метод на части разделить нельзя. можно ли сделать так чтобы не высвечивалось что она не отвечает? может я не до конца понимаю но по моему при установке больших по размеру программ или игр(или работа с архивацией) возникает та же самая ситуация: комп долго думает. Но при этом не пишет «Не отвечает».
Поток делал через BackgroundWorker
Код к задаче: «Программа «Не отвечает»»
Листинг программы
//////////////////// public Bitmap bmp3, bmp4; public Thread Gen; /////////////// if (s.ShowDialog() == DialogResult.OK) < string filename = s.FileName; FileStream f; for (int i = 0; i < numericUpDown1.Value; i++) < fr1.c = filename.Split(new char[] < ‘.’ >); f = new FileStream(fr1.c[0] + Convert.ToString(fr1.kk) + «.bmp», FileMode.Create); ThreadStart threadStart = delegate() < bmp4 = Generate(); >; //метод возвращает bmb3 Gen = new Thread(threadStart); Gen.Start(); bmp4.Save(f, System.Drawing.Imaging.ImageFormat.Bmp); fr1.kk++; f.Flush(); f.Close(); > >
Источник: studassistent.ru
Программа c # не отвечает после запуска события
Я разрабатываю пользовательский интерфейс для программы, и происходит что-то очень странное.
У меня есть текстовое представление, 2 кнопки и индикатор выполнения. Я перенаправил вывод на консоль в текстовое представление. поэтому, когда я нажимаю кнопки, я должен получать выходные сообщения. вначале все было нормально, но потом я использовал несколько более длинных процедур, я пытался войти в веб-службу и использовать веб-запросы.
Мой код работает почти так же, как и предполагалось, я могу войти в систему и выполнять свои веб-запросы. но поскольку ответы могут становиться медленными, я создал несколько выходных сообщений, и там моя проблема началась . Мой интерфейс не будет обновляться до тех пор, пока не будет запущен весь код, который я создал на моем конце обработчика событий. и когда этот код завершает выполнение, я получаю все выходные сообщения сразу. Я даже не могу переместить окно во время работы программы ..
Я впервые программирую на C #, мне пришлось использовать его, потому что мне нужно использовать dll . и такого рода проблем никогда не было. Я обычно использую Java. Это похоже на то, что код работает не в правильном порядке и для меня это не имеет смысла . потому что я знаю, что мой код правильный, потому что он запускается на консоли, и он выполняется, пока программа не отвечает .
Кажется, я этого не понимаю, должен ли я обрабатывать свои события с помощью потоков?
class MainClass < public static void Main (string[] args) < Application.Init (); UIMain win = new UIMain (); win.ShowAll (); Application.Run (); >> public partial class UIMain : Gtk.Window < public UIMain () : base (Gtk.WindowType.Toplevel) < System.Windows.Forms.Application.EnableVisualStyles (); this.Build (); Console.SetOut (new ControlWritter(this.textview1)); >protected void OnButton2Clicked (object sender, EventArgs e) < if (entry1.Text.Equals(String.Empty) || entry2.Text.Equals(String.Empty)) < Console.WriteLine(«random output»); >ConstantesSetup.autoSetup (); button1.Sensitive = true; if (!ConstantesSetup.var1) < ConstantesSetup.routine6 (); ConstantesSetup.routine5 (); ConstantesSetup.routine4 (); ConstantesSetup.routine3 (); ConstantesSetup.routine2 (); ConstantesSetup.var1 = true; >> protected void OnButton1Clicked (object sender, EventArgs e) < switch (ConstantesSetup.erp) < case «ERP»: eti_scp.autoSync (this); break; >> >
Прошу прощения за отсутствие кода, но даже не знаю, как начать искать проблему ..
😉
Источник: question-it.com