Softwareontwikkeling FAQ: .NETMet dank aan whoami. 
Inhoudsopgave
FAQWaar 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
BoekenADO.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.
|