Есть ли "стандартный" диалог ожидания / ожидания? - PullRequest
4 голосов
/ 30 марта 2009

Мое приложение C # запускается при запуске системы и должно ждать локального экземпляра SQL Server, пока оно на самом деле ничего не может сделать. Прямо сейчас я просто жду, пока сервер ответит (раньше я получал дескриптор ожидания для службы, но это было ненадежно), а затем запускаю главный диалог приложения.

Проблема с этим, конечно, заключается в том, что пользователь не может сказать, что происходит, пока не запустится служба, и из-за используемого нами оборудования это может занять до минуты. Поэтому я подумываю добавить какой-нибудь индикатор «Загрузка / Пожалуйста, подождите». Дело в том, что наш проект близок к блокировке, и такое изменение, как создание нового класса, вызовет много головной боли - изменение существующего файла (например, Program.cs) намного менее навязчиво, чем создание нового. Короче говоря: существует ли класс .NET, который будет хорошо отображаться (асинхронно, я полагаю) перед тем, как я начну подключаться к SQL Server, а затем будет удален, когда он начнет отвечать?

Ответы [ 4 ]

5 голосов
/ 01 апреля 2009

Вот трехпоточная версия, которую я быстро взломал, и которая поможет. Это может быть удалено в любом месте в видимой форме (или может быть изменено для program.cs) и вызовет новое, центрированное, модальное диалоговое окно с плавной прокруткой, которая будет доминировать в внимании пользователя, пока не будет установлена ​​FinishedProcessing в родительском потоке к истине.

        //Update to true when finished loading or processing
        bool FinishedProcessing = false;  

        System.Threading.AutoResetEvent DialogLoadedFlag
            = new System.Threading.AutoResetEvent(false);  


        (new System.Threading.Thread(()=> {

            Form StockWaitForm = new Form()
            { Name = "StockWaitForm", Text = "Please Wait...", ControlBox = false,
                FormBorderStyle = FormBorderStyle.FixedDialog, StartPosition = FormStartPosition.CenterParent,
                Width = 240, Height = 80, Enabled = true };

            ProgressBar ScrollingBar = new ProgressBar() 
            { Style = ProgressBarStyle.Marquee, Parent = StockWaitForm,
            Dock = DockStyle.Fill, Enabled = true };  

            StockWaitForm.Load += new EventHandler((x, y) =>
            {
                DialogLoadedFlag.Set();
                (new System.Threading.Thread(()=> {
                    while (FinishedProcessing == false) Application.DoEvents();
                    StockWaitForm.Invoke((MethodInvoker)(()=> StockWaitForm.Close()));
                })).Start();

            });  

            this.Invoke((MethodInvoker)(()=>StockWaitForm.ShowDialog(this)));  


        })).Start();  

        while (DialogLoadedFlag.WaitOne(100,true) == false)  Application.DoEvents();     
        //
        //Example Usage
        //Faux Work - Have your local SQL server instance load here
        for (int x = 0; x < 1000000; x++) int y = x + 2;  

        FinishedProcessing = true;

Настройка по вкусу. Кроме того, если вы используете это в производственном приложении, оберните содержимое нового потока в блоки try ... catch в CYA . И наконец, я выпускаю этот код для вас в рамках «Публичной лицензии Coderer / SO v1.1» следующим образом:

Coderer Public License / SO v1.0
Я, человек, известный как «Coderer» в сообществе «Переполнение стека», согласен тщательно рассмотреть вопрос о переходе на методологию управления проектами, которая позволяет добавлять дополнительные классы в проекты на этапе «Выполнение». Я понимаю, что нацистский контроль за изменениями вреден для всех вовлеченных сторон.

2 голосов
/ 30 марта 2009

Вот оболочка .NET вокруг стандартного диалогового окна прогресса Windows:

http://www.codeproject.com/KB/shell/iprogressdialognet.aspx

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

1 голос
/ 31 марта 2009

Как просто построить диалог "Пожалуйста, подождите ...", я не понимаю почему.

Насколько мне известно, нет. Нет на складе. Почти проще вырастить свою собственную ... или просто отключить форму и вызвать курсор песочных часов. Та же идея, и такая же простая в реализации.

0 голосов
/ 31 марта 2009

Вы можете рассмотреть возможность выполнения SQL-работы в BackgroundWorker (в рабочем потоке) Это оставит ваше приложение отзывчивым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...