Softwareontwikkeling FAQ - .NET

Pagina: 1
Acties:
  • 2.362 views sinds 30-01-2008

Onderwerpen


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 04-07 15:03

NMe

Quia Ego Sic Dico.

Topicstarter
Mede-auteur:
  • whoami
  • Registratie: December 2000
  • Laatst online: 19:05

whoami

Softwareontwikkeling FAQ: .NET

Met dank aan whoami. :)
Inhoudsopgave
« · ^

FAQ
Waar zet ik het beste een connectionstring?
De connectie-string zet je het best in je web.config. (Dit is ook te lezen in de best practices van Microsoft vermoed ik).

In de web.config kan je een sectie 'appSettings' bijmaken:
code:
1
2
3
4
5
<appSettings>

  <add key="connstring"
           value="hier komt de connectie-string" />
</appSettings>

Die connectiestring kan je dan makkelijk in uw code ophalen door gebruik te maken van het ConfigurationSettings object:
ASP.NET:
1
2
3
using System.Configuration;
....
string connstr = ConfigurationSettings.AppSettings["connstr"];

Over het hebben van 1 connectie die je overal kunt gebruiken:

Aangezien je gebruik kunt maken van connection pooling, is het beter om iedere keer een nieuw connectie-object te maken wanneer je het nodig hebt, en van zodra je geen database-connectie meer nodig hebt, die connectie te sluiten.

Zie ook:
  • Connection pooling for SQL Server data provider (ADO.NET)
  • Uit dit artikel:
    ADO.NET Connection
    You use the ADO.NET Connection object to create a connection between your program and a database engine. You will normally keep this connection open just long enough to retrieve or update data. By quickly opening, then closing a connection, you use server resources for as little time as possible. This helps you develop scalable, fast applications that are resource-friendly. The fewer resources you use, the more users you can support on your applications at one time.
Hoe geef ik de status van een thread door aan m'n windows-form?
Als je een bepaalde langlopende taak wilt uitvoeren in een Windows applicatie, en je wilt dat je applicatie nog 'responsive' is, dan kan je die 'taak' op een andere thread uitvoeren.

Echter, meestal wil je wel dat je in je applicatie kan zien hoever die 'taak' reeds gevorderd is.
Het probleem hierbij is, dat een 'Windows rule' zegt: 'Een control mag je enkel wijzigen / updaten vanuit de thread die deze control gemaakt heeft; de UI thread dus'.
Je kan dus niet zomaar vanuit je method die op een andere thread uitgevoerd wordt, status-messages over die functie in een listbox gaan tonen, of een ProgressBar gaan updaten.

Een manier om dit probleem op te lossen, is door gebruik te maken van het 'Task Pattern'. Dit is eigenlijk ook de manier die Microsoft gebruikt in hun BackGroundWorker class. Dit 'pattern' bestaat eigenlijk uit een class die jouw taak uitvoert. Bijvoorbeeld:
Onderstaand voorbeeld is redelijk concreet. Je zou dit generiek kunnen maken door de taak die je wilt uitvoeren als een delegate mee te geven aan die class.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
public class DoStuffOnFilesTask
{
        
    /// <summary>
    /// Bevat de file-names die moeten verwerkt worden.
    /// </summary>
    private string[]            _fileNames;

    /// <summary>
    /// Event die op geregelde tijdstippen uitgevoerd wordt om de 
    /// voortgang van het kopieëren weer te geven.
    /// </summary>
    public event EventHandler    ReportProgress;

    public DoStuffOnFilesTask( string[] files )
    {
        _fileNames = files;
    }

    /// <summary>
    /// Roep deze method aan om de taak te starten.
    /// </summary>
    /// <param name="multiThreaded"></param>
    public void    Run( bool multiThreaded )
    {
             if( multiThreaded )
             {
                   Thread t = new Thread (new ThreadStart (Work));
                   t.Start();
             }
             else
             {
                   Work();
             }
    }

    /// <summary>
    /// Method die het uiteindelijke werk doet.
    /// </summary>
    private void Work()
    {
        foreach( string file in _fileNames )
        {
            ProcessFile (file);
            OnReportProgress (EventArgs.Empty);
        }
    }

    /// <summary>
    /// Deze method raised de ReportProgress event op een veilige manier.
    /// </summary>
    /// <param name="e"></param>
    protected virtual void OnReportProgress( EventArgs e )
    {
        EventHandler                localHandler;
        localHandler = ReportProgress;

        // Check of we wel een event-handler hebben voor deze event.
        if( localHandler != null )
        {
            // Check of de event-handler op een windows control wordt uitgevoerd, en,
            // of die event op de UI thread moet uitgevoerd wordeen
            System.Windows.Forms.Control c = localHandler.Target as System.Windows.Forms.Control;

            if( c != null && c.InvokeRequired )
            {
                // Indien wel, invoke...
                c.Invoke (localHandler, new object[] {this, e});
            }
            else
            {
                // Anders, voer gewoon uit.
                localHandler (this, e);
            }
        }
    }

}

Dit is code die geschreven is voor .NET 1.1. In .NET 2.0 kan je gebruik maken van de BackGroundWorker class.

In .NET 2.0 pas je de OnReportProgress method ook best aan -als je de backgroundworker niet wilt gebruiken-, zodanig dat er niet gechecked wordt of de Target een System.Windows.Forms.Control is, maar checkt of de Target de System.ComponentModel.ISynchronizeInvoke interface implementeert. Op die manier hoef je - als je Task zich in een classlibrary bevindt - geen reference te leggen naar de System.Windows.Forms assembly.

« · ^

Links
« · ^

Boeken
ADO.NET
  • ADO.NET Programming

    Door: Arlen Feldman

    ISBN: 1930110294

    Manning Publications
ASP.NET
  • ASP.NET Unleashed

    Door: Stephen Walther

    ISBN: 0672320681

    Sams publishing
  • ASP.NET Website Programming: Problem - Design - Solution C# Edition

    Door: Marco Bellinaso, Kevin Hoffman

    ISBN: 1861006934

    Wrox Press
  • Professional ASP.NET

    Door: Alex Homer, Brian Francis, David Sussman, Karli Watson, Richard Anderson, Rob Howard

    ISBN: 1861004885

    Wrox Press
C#
  • Professional C#, Second Edition

    Door: Simon Robinson, K. Scott Allen, Ollie Cornes, Jay Glynn, Zach Greenvoss, Burton Harvey, Christian Nagel, Morgan Skinner, Karli Watson

    ISBN: 0764543989

    Wrox Press
  • C# and the .NET Platform

    Door: Andrew Troelsen

    ISBN: 1893115593

    APress
  • Learning C# (2nd edition)

    Door: Jesse Liberty

    ISBN: 0596003765

    O'Reilly & Associates inc.

[ Voor 68% gewijzigd door NMe op 21-12-2019 18:06 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Dit topic is gesloten.