2013-04-30 2 views
0

Я разрабатываю приложение Windows Form launcher/update/splash screen, которое будет использоваться на Windows Toughbook (планшет) Windows 7 на C#. Пусковая установка отлично работает на моем рабочем столе и одной из моих Toughbooks ... Однако тестирование на устройстве «реальной среды» занимает 20 + секунд, чтобы даже показать форму после первого запуска. (Как только форма отображается, она идет быстро, как приложение должно работать.) Первый запуск на устройстве после установки выполняется быстро, но после первого запуска требуется много времени.C# Windows Form принимает Forever для загрузки

Я не уверен, как это сделать, даже если это проверяется, поскольку это устройство, которое невозможно подключить через USB или установить в нашу сеть. Кажется, не имеет значения, открывается ли приложение файлами или нет. Фактически, в большинстве случаев приложение просто открывается, видите, что слишком рано проверять наличие другого обновления, запускает основное приложение и убивает себя.

Текущий процесс выглядит следующим образом:

конструктор:

public MyConstructor() { InitializeComponent(); } 

Форма загрузки:

private void Form1_Load(object sender, EventArgs e) 
{ 
    if (!isLoaded) 
    { 
     System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap("parentApplication.exe.config"); //Path to your config file 
     System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap); 
     log4net.Config.XmlConfigurator.Configure(); 
     WebRequest.url = configManager.AppSettings.Settings["SURL"].Value; 

     // Set a timer to run the update process momentarily to allow the UI thread to update and display. (UI must be idle to run Timer) 
     updateTimer = new System.Timers.Timer(1000); 
     updateTimer.Elapsed += new ElapsedEventHandler(beginUpdate); 
     updateTimer.Enabled = true; 
     isLoaded = true; 
    } 
} 

Процесс обновления

private void beginUpdate(Object sender, EventArgs e) 
{ 
    // If any of this fails, we still want to launch the main application. 
    try 
    { 
      // Prevent the timer from doing anything else. 
      updateTimer.Enabled = false; 

      string version = "0"; 
      try 
      { 
       Version v = AssemblyName.GetAssemblyName("ParentApplication.exe").Version; 
       version = v.ToString(); 
      } 
      catch 
      { 
       version = "0"; 
      } 

      updateProgress(5); 

      DateTime buffer = DateTime.Now.AddMinutes(-5); 
      DateTime last = Convert.ToDateTime(configManager.AppSettings.Settings[lastCheck].Value); 
      int comp = DateTime.Compare(buffer, last); 

      if (comp < 0) 
      { 
       // Begin update process 
       updateApplication(version); 
      } 

      updateProgress(100); 

      System.Threading.Thread.Sleep(1000); 
     } 
     catch (Exception er) 
     { 
      logger.Error("Error in update application.", er); 
     } 

     // The updater can't update itself. Launch the external application 
     // to handle the updating of the updater. This application also launches 
     // the main executable. 
     Process sync = new Process(); 
     sync.StartInfo.UseShellExecute = false; 
     sync.StartInfo.FileName = "FinishUpdate.exe"; 
     sync.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
     sync.StartInfo.Verb = "runas"; 
     sync.Start(); 
     Application.Exit(); 
} 
+0

«Висячие» в течение 20 секунд чувствуют себя как тайм-аут. Вы отмечаете, что устройства не находятся в сети. Есть ли какой-нибудь код (возможно, оставленный от разработки?), Который пытается открыть сетевой ресурс? Проверяет ли updateApplication() через сеть? –

+0

Открывает соединение через беспроводную карту с сервером, не входящим в нашу сеть. Интересно, что форма не появляется вообще за эти 20 секунд. Как только форма появляется, она делает все это хорошо. – teynon

+1

Форма не будет отображаться в течение 20 секунд, если что-то (например, сетевой вызов ...) блокирует очередь сообщений. Если вы делаете что-то, что может занять некоторое время, сделайте это в отдельном потоке (BackgroundWorker обычно хорошо работает в контексте WinForms). –

ответ

1

Из описания, профайлер может быть трудно настроить. Другой вариант - запустить StopWatch, который регистрирует время выполнения метода для произвольного файла журнала. Как только вы определите, какой метод работает плохо, вы можете повторить шаги, пока не сузите строку кода, вызывающую узкое место.

Смежные вопросы