C # Splash Screen Thread freeze [duplicate]

Добавьте заголовки управления кэшем в ваши HTML-файлы, чтобы они каждый раз загружались с сервера:

<header>
    <meta http-equiv="expires" content="0">
    <meta http-equiv="Cache-Control" content="no-cache" />
    <meta http-equiv="Pragma" content="no-cache" />
    ...
</header>

Затем добавляйте случайные хэши к именам файлов сценариев каждый раз, когда вы делаете новую версию, чтобы убедиться, что они не загружается из кеша:

<script src="./app.2tvsgggce45pwlhe.js" type="text/javascript"></script>
19
задан Linus Caldwell 13 June 2013 в 22:08
поделиться

5 ответов

После двух потоков немного запутанно, но я собираюсь взять удар и сказать это ...

Я не совсем понимаю ваш дизайн здесь, но если проблема в том, что при запуске второго приложения форма экрана заставки становится белой ... Скорее всего, это связано с тем, что заставка заполнена, выполняя весь этот код в GetFromServer (). Настолько занят, что у него нет времени, чтобы перекрасить себя.

Чтобы исправить эту проблему, я предлагаю вам использовать компонент BackGroundWorker для выполнения метода GetFromServer. Это будет запускать этот метод в отдельном потоке и оставить поток формы без повторной кражи.

1
ответ дан user 22 August 2018 в 06:57
поделиться

К сожалению, у меня недостаточно репутации, чтобы прокомментировать какой-то ответ. :( Это должно быть ответом на комментарий полковника Паники к Ханс Пассанс, отвечающий на .

Его проблема заключалась в том, что после new FormMain(args) будет отображаться MessageBox заставка. Ключ должен вызывать MessageBox из потока, за которым запускается заставка:

splashScreen.Invoke(new Action(() => {
    MessageBox.Show(splashScreen, "the message");
}));

Где splashScreen - ссылка на объект заставки, который был создан в OnCreateSplashScreen и очевидно, должен быть дан новому объекту Form1.

3
ответ дан Community 22 August 2018 в 06:57
поделиться

Тот же вопрос, тот же ответ:

.NET framework имеет отличную встроенную поддержку заставки. Запустите новый проект WF, Project + Add Reference, выберите Microsoft.VisualBasic. Добавьте новую форму, назовите ее frmSplash. Откройте Project.cs и сделайте так:

using System;
using System.Windows.Forms;
using Microsoft.VisualBasic.ApplicationServices;

namespace WindowsFormsApplication1 {
  static class Program {
    [STAThread]
    static void Main(string[] args) {
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      new MyApp().Run(args);
    }
  }
  class MyApp : WindowsFormsApplicationBase {
    protected override void OnCreateSplashScreen() {
      this.SplashScreen = new frmSplash();
    }
    protected override void OnCreateMainForm() {
      // Do your time consuming stuff here...
      //...
      System.Threading.Thread.Sleep(3000);
      // Then create the main form, the splash screen will close automatically
      this.MainForm = new Form1();
    }
  }
}
81
ответ дан Hans Passant 22 August 2018 в 06:57
поделиться
  • 1
    Что делать, если вы хотите передать аргументы Form1? Я смог сделать это, используя статический класс для хранения значения, но мне было интересно, был ли у вас более простой способ. – KClough 13 November 2009 в 17:47
  • 2
    Просто используйте this.MainForm = new Form1 (аргументы); – Hans Passant 13 November 2009 в 23:14
  • 3
    +1 Очень приятно, не знал об этом. – SwDevMan81 24 February 2011 в 22:41
  • 4
    Осторожно. Если new FormMain(args) показывает окно сообщения, он откроет заставку за . @Hans Passant вы знаете, что исправить? Не говорите «сделать конструктор проще» - если бы я мог исправить то, что мне не нужен всплеск экрана! – Colonel Panic 1 August 2013 в 10:34
  • 5
    «Сон ()» это ваш многолетний фоновой активности. – Greg D 14 August 2013 в 14:21

Вы действительно должны дать более подробную информацию о своей проблеме. Я мог быть совершенно неправ, но я сделаю снимок в темноте. Из того, что я представляю, происходит, и вы хотите, вы хотите, чтобы экран заставки отображался, выполнял некоторую обработку в другом потоке, затем экран заставки исчезнет, ​​когда закончите.

Чтобы сделать это, вы 'захочет переместить вызов GetFromServer() на BackgroundWorker. Затем переместите код

    this.Hide();
    _serverData = new ArrayList();
    _thisData.Add(_allServerNarrators);
    _thisData.Add(_serverNarrators);

в обработчик события BackgroundWorker_RunWorkerCompleted.

Чтобы использовать BackgroundWorker :

1) Инициализировать BackGroundWorker

  BackgroundWorker myWorker = new BackgroundWorker();

2) Добавить обработчики событий

  myWorker.DoWork += new DoWorkEventHandler(myWorker_DoWork);
  //put the work you want done in this one

  myWorker.RunWorkerCompleted += 
      new RunWorkerCompletedEventHandler(myWorker_RunWorkerCompleted);
  //this gets fired when the work is finished

3) Добавить код в обработчики событий.

4) Вызовите myWorker.RunWorkerAsync(), чтобы начать работать.

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

1
ответ дан lc. 22 August 2018 в 06:57
поделиться
3
ответ дан Community 5 November 2018 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: