-
Notifications
You must be signed in to change notification settings - Fork 606
/
Copy pathProgram.cs
113 lines (98 loc) · 3.19 KB
/
Program.cs
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using Dapper;
using StackExchange.Profiling;
using System;
using System.Data.Common;
using System.Diagnostics;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using static System.Console;
namespace Samples.Console
{
/// <summary>
/// simple sample console application.
/// </summary>
public static class Program
{
/// <summary>
/// application entry point.
/// </summary>
public static async Task Main()
{
try
{
await TestAsync();
TestMultiThreaded();
WriteLine(MiniProfiler.Current.RenderPlainText());
if (Debugger.IsAttached)
ReadKey();
}
catch (Exception ex)
{
WriteLine(ex);
}
}
/// <summary>
/// Test the profiling.
/// </summary>
public static async Task TestAsync()
{
var mp = MiniProfiler.StartNew("Test");
using (mp.Step("Level 1"))
using (var conn = GetConnection())
{
conn.Query<long>("select 1");
using (mp.Step("Level 2"))
{
conn.Query<long>("select 1");
}
using (var client = new HttpClient())
using (mp.CustomTiming("http", "GET https://google.com"))
{
await client.GetAsync("https://google.com");
}
}
await mp!.StopAsync();
WriteLine(MiniProfiler.Current.RenderPlainText());
}
public static void TestMultiThreaded()
{
var mp = MiniProfiler.StartNew("Locking");
static void doWork() => Thread.Sleep(new Random().Next(1, 50));
using (mp.Step("outer"))
{
Parallel.For(0, 5, i =>
{
doWork();
using (mp.Step("step " + i))
{
using (mp.CustomTiming("MyCustom", "test command"))
{
doWork();
}
using (mp.Step("sub-step" + i))
{
doWork();
}
}
});
}
}
/// <summary>
/// Returns an open connection that will have its queries profiled.
/// </summary>
/// <returns>the database connection abstraction</returns>
public static DbConnection GetConnection()
{
DbConnection cnn = new Microsoft.Data.Sqlite.SqliteConnection("Data Source=:memory:");
// to get profiling times, we have to wrap whatever connection we're using in a ProfiledDbConnection
// when MiniProfiler.Current is null, this connection will not record any database timings
if (MiniProfiler.Current != null)
{
cnn = new StackExchange.Profiling.Data.ProfiledDbConnection(cnn, MiniProfiler.Current);
}
cnn.Open();
return cnn;
}
}
}