1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using System.Threading;
6: using System.Threading.Tasks;
7:
8: namespace SynchronizationSamples
9: {
10: public class SharedState
11: {
12: private int state = 0;
13: private object syncRoot = new object();
14: public int State
15: {
16: get{return state;}
17: set { state = value; }
18: }
19:
20: public int IncrementState()
21: {
22: bool lockTaken = false;
23: Monitor.TryEnter(syncRoot, 500, ref lockTaken);
24: if (lockTaken)
25: {
26: try
27: {
28: return ++state;
29: }
30: finally
31: {
32: Monitor.Exit(syncRoot);
33: }
34: }
35: else
36: {
37: return state;
38: }
39: }
40: }
41:
42: public class Job
43: {
44: SharedState sharedState;
45: public Job(SharedState sharedState)
46: {
47: this.sharedState = sharedState;
48: }
49:
50: public void DoTheJob()
51: {
52: for (int i = 0; i < 50000;i++ )
53: {
54: sharedState.IncrementState();
55: }
56: }
57: }
58: class Program
59: {
60: static void Main(string[] args)
61: {
62: int numTasks = 20;
63: var state = new SharedState();
64: var tasks = new Task[numTasks];
65:
66: for (int i = 0; i < numTasks; i++)
67: {
68: tasks[i] = new Task(new Job(state).DoTheJob);
69: tasks[i].Start();
70: }
71:
72: for (int i = 0; i < numTasks;i++ )
73: {
74: tasks[i].Wait();
75: }
76: Console.WriteLine("summarized {0}",state.State);
77: Console.Read();
78: }
79: }
80: }