От .NET к Mono - сбой при ударе WinForms - PullRequest
1 голос
/ 16 апреля 2011

Несколько лет назад я написал это приложение для рулетки на .NET 1.1, используя C # и Visual Studio.net: http://www.lonniebest.com/Roulette/

С апреля 2007 года я использую исключительно Ubuntu Linux, поэтому сегодня я попытался перекомпилировать этот старый код, используя MonoDevelop IDE. К моему изумлению, код был скомпонован без ошибок, и я смог запустить это приложение Windows Forms в Ubuntu.

Все работало нормально (сначала), , когда я вращал колесо рулетки по одному вращению за раз . Он бы даже работал нормально, если бы я сказал ему крутить его 10 раз подряд. Однако, слишком много (подряд), чем это, приложения аварийно завершают работу, и все, что я вижу на панели «Вывод приложения» в MonoDevelop, это:

The application was terminated by a signal: SIGHUP

(В Visual Studio я ожидал, что это приведет меня к необработанному исключению в моем коде, но MonoDevelop, кажется, только отображает вышеуказанный вывод на панели «Вывод приложения».)

Это приложение действительно забивает Windows Forms, оно обновляет многочисленные элементы формы снова и снова с каждым вращением, так быстро, как это может быть визуализировано. Если вы запустите его в версии .NET, которую я разместил по ссылке выше, вы увидите, что она обновляет все эти элементы формы более 100 раз в секунду. Это может быть необязательно, но и приложение в целом не является, и я намерен это сделать.

Скомпилированные с Visual Studio и работающие в Windows .NET, приложения могут выполнять миллионы вращений без сбоев.

Итак, что может позволить мне сделать этот код более устойчивым в Mono / Linux, в свете описанного выше сбоя "SIGHUP"?

Я приложил MonoDevelop Solution к этому отчету об ошибке: https://bugzilla.novell.com/show_bug.cgi?id=688014

1 Ответ

2 голосов
/ 17 апреля 2011

Следующее подтверждение концепции показывает, что это, вероятно, беспорядочное использование элементов управления Windows Forms из потока, не являющегося пользовательским интерфейсом.Это доказательство концепции совершенно бессмысленно, потому что я точно не хотел выяснять, какие строки в вашей функции DisplayResults из 328 строк были виновниками.Вы можете использовать ссылки ниже, чтобы облегчить вашу ситуацию.

Читайте об этом здесь:

Следующий патч полностьюснимает симптомы для меня.

diff --git a/Roulette/Roulette.cs b/Roulette/Roulette.cs
index d5ede34..ae098ac 100644
--- a/Roulette/Roulette.cs
+++ b/Roulette/Roulette.cs
@@ -402,6 +402,7 @@ namespace Roulette
                        //
                        // TODO: Add any constructor code after InitializeComponent call
                        //
+                       Application.Idle += (sender, e) => DisplayResultsEx();
                }

                /// <summary>
@@ -5135,6 +5136,11 @@ namespace Roulette

                public void DisplayResults()
                {
+
+               }
+
+               private void DisplayResultsEx()
+               {
                        //Display the current result.
                        lblCurrentResult.Text = m_Wheel1.CurrentResult.Name;
...