Cookies op Tweakers

Tweakers maakt gebruik van cookies, onder andere om de website te analyseren, het gebruiksgemak te vergroten en advertenties te tonen. Door gebruik te maken van deze website, of door op 'Ga verder' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt, bekijk dan ons cookiebeleid.

Meer informatie
Toon posts:

Programming FAQ - .NET

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

Onderwerpen


  • NMe
  • Registratie: februari 2004
  • Laatst online: 21:55

NMe

Admin Devschuur®

Quia Ego Sic Dico.

Topicstarter
Mede-auteur:
  • whoami
  • Registratie: december 2000
  • Laatst online: 19:21

whoami

Programming 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.

BtM909 wijzigde deze reactie 05-11-2008 16:33 (68%)

'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.



Apple iPhone 11 Nintendo Switch Lite LG OLED C9 Google Pixel 4 FIFA 20 Samsung Galaxy S10 Sony PlayStation 5 Smartphones

'14 '15 '16 '17 2018

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2019 Hosting door True