2014-11-13 3 views
0
Thread splashScreenThread = new Thread(new ParameterizedThreadStart(DisplaySplashScreen)); 
splashScreenThread.SetApartmentState(ApartmentState.STA); 
splashScreenThread.IsBackground = true; 
splashScreenThread.Start(moduleName); 

Приведенный выше код после выполнения от 30 до 50 раз сбой OutOfMemoryException.Thread Start вызывает исключение OOM

Если я попробую splashScreenThread.Join, когда функция DisplaySplashScreen закрывается, приложение зависает.

UPDATE:

машина развития является 64 разрядной машиной и приложение под вопросом является 32 бит WPF приложения с помощью PRISM.

Каждый раз, когда открывается модуль, открывается окно всплеска. Когда модуль открывается, окно всплеска закрывается.

private void DisplaySplashScreen(object moduleName) 
     { 
      if (moduleName != null) 
       splashScreen = new SplashWindow(moduleName.ToString(), this.SplashScreenDescription); 
      else 
       splashScreen = new SplashWindow(string.Empty, string.Empty); 

      splashScreen.ShowDialog(); 
     } 

Примечание: SplashWindows является обычай окно, которое показано и закрывается позже автоматически.

запуска модуля загрузки и нагруженные конец FNS:

private void ModuleLoadingStart(object moduleName) 
     { 
      if (this.ModuleLoadingVisibility != Visibility.Visible) 
      { 
       this.ModuleLoadingVisibility = Visibility.Visible; 

       // Spawn off a new thread 
       Thread splashScreenThread = new Thread(new ParameterizedThreadStart(DisplaySplashScreen)); 
       splashScreenThread.SetApartmentState(ApartmentState.STA); 
       splashScreenThread.IsBackground = true; 
       splashScreenThread.Start(); 
      } 
     } 



private void ModuleLoadingEnd() 
     { 
      if (this.ModuleLoadingVisibility != Visibility.Collapsed) 
      { 
       this.ModuleLoadingVisibility = Visibility.Collapsed; 

       while (true) 
       { 
        if (splashScreen == null) 
         Thread.Sleep(100); 
        else 
         break; 
       } 

       CloseSplashScreenDelegate myDel = new CloseSplashScreenDelegate(splashScreen.Close); 

       splashScreen.Dispatcher.Invoke(myDel, null); 
      } 
     } 

Что я здесь отсутствует?

+0

Сколько потоков выполняется в вашем приложении во время исключения? и какова память, занятая этим процессом? –

+0

Я бы сказал, что вам, вероятно, нужно отправить код в 'DisplaySplashScreen', так как могут быть утечки памяти в этом методе – user1

+0

Невозможно сказать из опубликованного кода, но вам, вероятно, не хватает эквивалента [этого] (http: // referencesource.microsoft.com/#WindowsBase/Base/System/Windows/SplashScreen.cs,57538949b88b042f). –

ответ

0

WTF Вы создаете так много потоков для ?! Знаете ли вы, что Thread s - голодные звери. Каждый из них занимает много мегабайт непрерывного барана!

Anyways. Вы говорите, что

Если я попробую splashScreenThread.Join, когда функция DisplaySplashScreen закрывается, приложение зависает.

Это довольно просто диагностировать. Проблема здесь в том, что вы получили Thread.Join совершенно неправильно.

Пункт Thread.Join состоит в том, чтобы блокировать (останавливать все и ждать) текущую нить, пока работа на другом Thread не будет завершена. Проблема здесь в том, что splashScreenThread находится в цикле. В частности, цикл по отображаемому коду. Поэтому он НИКОГДА не завершится. Следовательно, вы сказали своей основной теме подождать и ничего не делать до бесконечности.

+0

* Каждый из них занимает много мегабайт непрерывного бара *? Что, если нет от меня? По умолчанию требуется только один мегабайт бара (зафиксированный) в .net. –

+0

@SriramSakthivel работает под x86, я полагаю. – Aron

+0

Я не пользуюсь Join. Я просто попробовал, и это было не так. –

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