Hirdetés

Új hozzászólás Aktív témák

  • x007

    tag

    válasz sunsaw #1225 üzenetére

    A problémádat megoldja, hogyha a DisableControls() után meghívod a Application.DoEvents() metódust. Az ilyen megoldásokat azonban, ha lehet, kerüljük. Általánosságban elmondható, hogy időigényes feladatokat nem hajtunk végre a GUI szálon (ilyen egy vezérlő eseménye is, pl: Click), hanem egy új szálat hozunk létre, hogy a végrehajtás a háttérben történjen. Ezt könnyen megteheted a BackgroundWorker komponens segítségével, elég sok problémát levesz a programozó válláról.

    Valami ilyet kéne csinálnod:
    private void button1_Click(object sender, EventArgs e)
    {
    DbDetails arg =
    new DbDetails
    {
    Server = ...,
    Database = ...,
    User = ...,
    Password = ...,
    };

    connectStatusBar.Items[0] = "Testing connection...";
    DisableControls();

    backgroundWorker1.RunWorkerAsync(arg);
    }

    private class DbDetails
    {
    public string Server { set; get; }
    public string Database { set; get; }
    public string User { set; get; }
    public string Password { set; get; }
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
    DbDetails arg = e.Argument as DbDetails;

    e.Result = TestConnection(arg.Server, arg.Database, arg.User, arg.Password);
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
    if (e.Error != null && (bool)e.Result)
    {
    //Sikerult csatlakozni
    //TODO: Impl
    }
    else
    {
    //Nem sikerult csatlakozni
    //TODO: Impl
    }

    }

    A DoWork eseménykezelőbe kell helyezned a kódot, amit a háttérben szeretnél végrehajtani. Fontos, hogy ebben nem hivatkozhatsz a Form-on található vezérlőkre szinkronizációs problémák miatt. Ezért van szükség jelen példában a DbDetails segédosztályra.

    A RunWorkerCompleted eseménykezelő a feladat végrehajtása után mindig végrehajtódik. Ha valamilyen kivétel keletkezett, akkor azt a e.Error tulajdonságból kiolvashatod. Az e.Result tulajdonságból a DoWork eseménykezelőben beállított visszatérési érték olvasható ki.

    [ Szerkesztve ]

Új hozzászólás Aktív témák