Многопоточный экран-заставка в C#?

Чтобы запустить этот код, вам нужно заменить учетные данные myStringName \ myInstanceName, myDataBase, myUsername, myPassword вашими

using System.Data;   
using System.Data.SqlClient;

string sConnectionString = @"Data Source=myServerName\myInstanceName;Initial Catalog=myDataBase;User ID=myUsername;Password=myPassword;";

protected void Page_Load(object sender, EventArgs e){
    if(!IsPostBack)
        BindGridView();   
}

private void BindGridView() {             
    DataTable dt = new DataTable();           
    SqlConnection con = null;         

    try {
        string sQuery = "SELECT ID, Name, Salary FROM EmpDetail";

        SqlConnection con = new SqlConnection(sConnectionString);
        con.Open();
        SqlCommand cmd = new SqlCommand(sQuery, con); 
        SqlDataReader sdr = cmd.ExecuteReader();

        dt.Load(sdr);
        Gridview1.DataSource = dt;
        Gridview1.DataBind();
    }
    catch{ }
    finally{
        dt.Dispose();
        con.Close();
    }
}
60
задан Randika Vishman 9 May 2019 в 03:30
поделиться

7 ответов

Ну, для приложения ClickOnce, которое я развернул в прошлом, мы использовали Microsoft.VisualBasic пространство имен для обработки поточной обработки экрана-заставки. Можно сослаться и использовать Microsoft.VisualBasic блок от C# в.NET 2.0, и это предоставляет много хороших услуг.

  1. Имеют основную форму, наследовались от Microsoft.VisualBasic.WindowsFormsApplicationBase
  2. Переопределение метод "OnCreateSplashScreen" как так:

    protected override void OnCreateSplashScreen()
    {
        this.SplashScreen = new SplashForm();
        this.SplashScreen.TopMost = true;
    }
    

Очень простой, это показывает Ваш SplashForm (который необходимо создать), в то время как загрузка идет, затем закрывает его автоматически, как только основная форма завершила загрузку.

Это действительно делает вещи простыми, и эти VisualBasic.WindowsFormsApplicationBase, конечно, хорошо тестируется Microsoft и имеет большую функциональность, которая может сделать Вашу жизнь намного легче в Winforms, даже в приложении, которое является 100%-м C#.

В конце дня, это - весь IL и bytecode так или иначе, итак, почему бы не использовать его?

46
ответ дан Guy Starbuck 24 November 2019 в 17:37
поделиться

Одним простым путем является использование что-то вроде этого как основное ():

<STAThread()> Public Shared Sub Main()

    splash = New frmSplash
    splash.Show()

    ' Your startup code goes here...

    UpdateSplashAndLogMessage("Startup part 1 done...")

    ' ... and more as needed...

    splash.Hide()
    Application.Run(myMainForm)
End Sub

, Когда CLR.NET запускает Ваше приложение, он создает 'основной' поток и начинает выполнять Ваше основное () на том потоке. Приложение. Выполненный (myMainForm) в конце делает две вещи:

  1. Запускает Windows 'насос сообщения', с помощью потока, который выполнялся основной () как поток GUI.
  2. Определяет Вашу 'основную форму' как 'форму завершения работы' для приложения. Если пользователь закрывает ту форму, то Приложение. Выполненный () завершается, и управление возвращается к Вашему основному (), где можно сделать любое завершение работы, Вы хотите.

нет никакой потребности породить поток для заботы об окне всплеска, и на самом деле это - плохая идея, потому что тогда необходимо было бы использовать ориентированные на многопотоковое исполнение методы для обновления контента всплеска от основного ().

при необходимости в других потоках, чтобы сделать фоновые работы в приложении, можно породить их от основного (). Просто не забудьте устанавливать Поток. IsBackground к Правда, так, чтобы они умерли, когда основное / поток GUI завершится. Иначе необходимо будет расположить завершить все другие потоки сами, или они поддержат приложение (но без GUI), когда основной поток завершится.

5
ответ дан McKenzieG1 24 November 2019 в 17:37
поделиться

Прием создать отдельный поток, ответственный за показ экрана-заставки.
при выполнении Вас приложение .net создает основной поток и загружает определенную (основную) форму. Для сокрытия тяжелой работы, можно скрыть основную форму, пока загрузка не сделана.

Предположение, что Form1 - является Вашей основной формой и SplashForm, является верхним уровнем, безграничной хорошей формой всплеска:

private void Form1_Load(object sender, EventArgs e)
{
    Hide();
    bool done = false;
    ThreadPool.QueueUserWorkItem((x) =>
    {
        using (var splashForm = new SplashForm())
        {
            splashForm.Show();
            while (!done)
                Application.DoEvents();
            splashForm.Close();
        }
    });

    Thread.Sleep(3000); // Emulate hardwork
    done = true;
    Show();
}
46
ответ дан aku 24 November 2019 в 17:37
поделиться

Я думаю с помощью некоторого метода как aku's или , Guy является способом пойти, но несколько вещей отнять у определенных примеров:

  1. основная предпосылка должна была бы показать Ваш всплеск на отдельном потоке как можно скорее. Это - способ, которым я склонился бы, подобный тому, какой проиллюстрированный aku's, так как это - способ, с которым я являюсь самым знакомым. Я не знал о функции VB, которую упомянул Guy. И, даже думал, что это библиотека VB, он прав - это - весь IL в конце. Так, даже если это чувствует себя грязным , это не все настолько плохо!:) Я думаю, что Вы захотите быть уверенными, что или VB обеспечивает отдельный поток для в том переопределении или что Вы создаете тот сами - определенно исследование это.

  2. Принятие Вы создаете другой поток для отображения этого всплеска, Вы захотите остерегаться перекрестного потока обновления UI. Я поднимаю это, потому что Вы упомянули, что обновили прогресс. В основном, для сейфа необходимо вызвать функцию обновления (что Вы создаете) на форме всплеска с помощью делегата. Вы передаете того делегата в эти , Вызывают функция на объект формы Вашего экрана-заставки. На самом деле при вызове формы всплеска непосредственно для обновления элементов прогресса/UI на нем, Вы обеспечите исключение, Вы работаете на.Net 2.0 CLR. Как показывает опыт, любой элемент UI на форме должен быть обновлен потоком, который создал его - это что Форма. Вызовите обеспечивает.

Наконец, я, вероятно, решил бы создать всплеск (не используя перегрузку VB) в основном методе Вашего кода. Мне это лучше, чем наличие основной формы выполняет создание объекта и быть так плотно связанным с ним. Если бы Вы проявляете тот подход, я предложил бы создать простой интерфейс, который экран-заставка реализует - что-то как IStartupProgressListener - который получает обновления прогресса запуска через функцию членства. Это позволит Вам легко подкачивать в / любом классе по мере необходимости, и приятно разъединяет код. Форма всплеска может также знать, когда закрыть себя, если Вы уведомляете, когда запуск завершен.

6
ответ дан Community 24 November 2019 в 17:37
поделиться

Я рекомендую вызову активировать (); непосредственно после последнего Show (); в ответе, предоставленном AKU.

цитирование MSDN:

Активация формы приносит его к Фронт, если это активный приложение, или это мигает окно подпись, если это не активный заявление. Форма должна быть видна Для этого метода иметь любой эффект.

Если вы не активируете свою основную форму, он может отображаться позади любые другие открытые окна, что делает его немного глупо.

8
ответ дан 24 November 2019 в 17:37
поделиться

Я опубликовал статью о включении экрана Splash в приложении в CodeProject. Это многопоточковатый и может быть твоего интереса

еще один экран всплеска в C #

4
ответ дан 24 November 2019 в 17:37
поделиться

Это старый вопрос, но я постоянно сталкивался с ним, когда пытался найти решение для потоковой заставки для WPF, которое могло бы включать анимацию.

Вот что я в итоге собрал:

App.XAML:

<Application Startup="ApplicationStart" …

App.XAML.cs:

void ApplicationStart(object sender, StartupEventArgs e)
{
        var thread = new Thread(() =>
        {
            Dispatcher.CurrentDispatcher.BeginInvoke ((Action)(() => new MySplashForm().Show()));
            Dispatcher.Run();
        });
        thread.SetApartmentState(ApartmentState.STA);
        thread.IsBackground = true;
        thread.Start();

        // call synchronous configuration process
        // and declare/get reference to "main form"

        thread.Abort();

        mainForm.Show();
        mainForm.Activate();
  }
9
ответ дан 24 November 2019 в 17:37
поделиться
Другие вопросы по тегам:

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