Как отобразить что-то вроде «загрузка ...», пока я делаю некоторые проверки загрузки формы? - PullRequest
5 голосов
/ 14 января 2012

Я делаю некоторые проверки загрузки формы, но она блокирует форму на период (несколько тысячных секунд). По этой причине я хочу отобразить сообщение типа «загрузка приложения ...», но не знаю, как мне это сделать. Я надеюсь, что это ясно! Любая помощь очень ценится. Заранее спасибо.

Ответы [ 5 ]

10 голосов
/ 14 января 2012

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

. Вы должны привязать свои проверки к событию DoWork фонового работника и вызвать метод RunWorkerAsync() BackgroundWorker's из события Form_Load, чтобы запуститьфоновая работа.

Примерно так (обратите внимание, это не проверено):

BackgroundWorker bw = new BackgroundWorker();
public void Form_Load(Object sender, EventArgs e) {
    // Show the loading label before we start working...
    loadingLabel.Show();
    bw.DoWork += (s, e) => {
       // Do your checks here
    }
    bw.RunWorkerCompleted += (s, e) => { 
       // Hide the loading label when we are done...
       this.Invoke(new Action(() => { loadingLabel.Visible = false; })); 
    };
    bw.RunWorkerAsync();
}
2 голосов
/ 14 января 2012

Это может быть легко достигнуто путем отображения отдельной формы, выполненной в другом потоке.В этой форме (назовите ее frmSplash) вы можете поместить анимированный GIF или статический текст.В основной форме вам потребуется следующий код:

Объявите некоторые переменные после класса.

public partial class frmMain : Form
{
   public Thread th1;
   static frmSplash splash;
   const int kSplashUpdateInterval_ms = 1;

// Rest of code omitted

Затем добавьте следующий метод в основную форму.Это запустит экран-заставку:

static public void StartSplash()
{
    // Instance a splash form given the image names
    splash = new frmSplash(kSplashUpdateInterval_ms);

    // Run the form
    Application.Run(splash);
} 

Далее вам нужен метод, чтобы закрыть экран-заставку:

private void CloseSplash()
{
    if (splash == null)
        return;

    // Shut down the splash screen
    splash.Invoke(new EventHandler(splash.KillMe));
    splash.Dispose();
    splash = null;
} 

Затем в основной загрузке формы сделайте следующее:

private void frmMain_Load(object sender, EventArgs e)
{
    try
    {
        Thread splashThread = new Thread(new ThreadStart(StartSplash));
        splashThread.Start();

        // Set the main form invisible so that only the splash form shows
        this.Visible = false;

        // Perform all long running work here. Loading of grids, checks etc.
        BindSalesPerson();
        BindCustomer();
        BindBrand();

        // Set the main form visible again
        this.Visible = true;
    }
    catch (Exception ex)
    {
        // Do some exception handling here
    }
    finally
    {
        // After all is done, close your splash. Put it here, so that if your code throws an exception, the finally will close the splash form
        CloseSplash();
    }

} 

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

protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    // Make sure the splash screen is closed
    CloseSplash();
    base.OnClosing(e);
} 

Код для формы Splash (в файле frmSplash.cs) следующий:

public partial class frmSplash : Form
{

    System.Threading.Timer splashTimer = null;
    int curAnimCell = 0;
    int numUpdates = 0;
    int timerInterval_ms = 0;

    public frmSplash(int timerInterval)
    {
        timerInterval_ms = timerInterval;

        InitializeComponent();
    } 


    private void frmSplash_Load(object sender, EventArgs e)
    {
        this.Text = "";
        this.MaximizeBox = false;
        this.MinimizeBox = false;
        this.ControlBox = false;
        this.FormBorderStyle = FormBorderStyle.None;
        this.Menu = null;
    } 

    public int GetUpMilliseconds()
    {
        return numUpdates * timerInterval_ms;
    }

    public void KillMe(object o, EventArgs e)
    {
        //splashTimer.Dispose();

        this.Close();
    }        
}

Надеюсь, это поможет вам.Возможно, это не самый лучший код, когда-либо написанный, но он работал для меня.

2 голосов
/ 14 января 2012

Посмотрите на BackgroundWorker компонент.Вам не нужны никакие знания потоков.

2 голосов
/ 14 января 2012

Вы можете создать другую ветку для отображения сообщения о загрузке.

Сначала вам нужен bool.

bool loading = true;

Создайте тему вроде:

Thread myThread = new Thread(new ThreadStart(Loading));
myThread .Start();

Затеместь метод:

private void Loading()
{
    while(loading)
    {
        //Display loading message here.
    }
}

Когда вы закончите загрузку, просто установите загрузку в false и шаг будет прерван.

0 голосов
/ 23 марта 2016

Вам нужно создать одну форму, которая здесь загружается .. вам нужно создать объект этой формы, который вызывается с использованием концепции потоков ... и в FrmLoading поместите один Picturebox и установите в нем изображение .gif.

FrmLoading f2 = new FrmLoading();
using (new PleaseWait(this.Location, () =>MethodWithParameter())) {      f2.Show(this); }
f2.Close();

Как показано выше, вам необходимо создать класс PleaseWait.

PleaseWait.cs

public class PleaseWait : IDisposable
{
private FrmLoading mSplash;
private Point mLocation;

public PleaseWait(Point location, System.Action methodWithParameters)
{
    mLocation = location;
    Thread t = new Thread(new ThreadStart(workerThread));
    t.IsBackground = true;
    t.SetApartmentState(ApartmentState.STA);
    t.Start();
    methodWithParameters();
}
public void Dispose()
{
    mSplash.Invoke(new MethodInvoker(stopThread));
}
private void stopThread()
{
    mSplash.Close();
}
private void workerThread()
{
    mSplash = new FrmLoading();   // Substitute this with your own
    mSplash.StartPosition = FormStartPosition.CenterScreen;
    //mSplash.Location = mLocation;
    mSplash.TopMost = true;
    Application.Run(mSplash);
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...