1: public partial class _Default : System.Web.UI.Page
2: {
3: int i1 = 0;
4: int i2 = 0;
5: int i3 = 0;
6:
7: WaitHandle[] waitHandles = new WaitHandle[]
8: {
9: new ManualResetEvent(false),
10: new ManualResetEvent(false),
11: new ManualResetEvent(false)
12: };
13:
14:
15: protected void Page_Load(object sender, EventArgs e)
16: {
17:
18: }
19:
20: protected void Button1_Click(object sender, EventArgs e)
21: {
22: Stopwatch sw = new Stopwatch();
23:
24: sw.Start();
25:
26: WaitCallback method1 = new WaitCallback(DoWork1);
27: bool isQueued1 = ThreadPool.QueueUserWorkItem(method1, waitHandles[0]);
28:
29: WaitCallback method2 = new WaitCallback(DoWork2);
30: bool isQueued2 = ThreadPool.QueueUserWorkItem(method2, waitHandles[1]);
31:
32: WaitCallback method3 = new WaitCallback(DoWork3);
33: bool isQueued3 = ThreadPool.QueueUserWorkItem(method3, waitHandles[2]);
34:
35: if (WaitHandle.WaitAll(waitHandles, 5000, false))
36: Label1.Text = (i1 + i2 + i3).ToString();
37: else
38: Label1.Text = "Problem";
39:
40: }
41:
42: void DoWork1(object state)
43: {
44: int.TryParse(TextBox1.Text, out i1);
45:
46: //HEAVY QUERY GOES HERE. Sleep is for the demo only! Remove it!
47: Thread.Sleep(i1);
48: ManualResetEvent mre = (ManualResetEvent)state;
49: mre.Set();
50:
51: }
52:
53: void DoWork2(object state)
54: {
55: int.TryParse(TextBox2.Text, out i2);
56:
57: //HEAVY QUERY GOES HERE. Sleep is for the demo only! Remove it!
58: Thread.Sleep(i2);
59: ManualResetEvent mre = (ManualResetEvent)state;
60: mre.Set();
61: }
62:
63: void DoWork3(object state)
64: {
65: int.TryParse(TextBox3.Text, out i3);
66:
67: //HEAVY QUERY GOES HERE. Sleep is for the demo only! Remove it!
68: Thread.Sleep(i3);
69: ManualResetEvent mre = (ManualResetEvent)state;
70: mre.Set();
71: }
72:
73: }