AsynqTest.Program.Main C# (CSharp) Method

Main() static private method

static private Main ( string args ) : void
args string
return void
        static void Main(string[] args)
        {
            Console.WriteLine("Press a key to begin.");
            Console.ReadKey();
#if false
            // Example 1:
            {
                // Get a sample QueryDescriptor to play with:
                var sampleDescriptor = SampleQueryDescriptors.Default.GetIntsFrom0to99;
                // Instruct the descriptor to build its IQueryable:
                var sampleQuery = sampleDescriptor.Construct(null, NoParameters.Default);

                // Lets display that IQueryable's Expression:
                Console.WriteLine(sampleQuery.Query.Expression.ToString());

                // Enumerate the query, projecting each row to its final type:
                foreach (object row in sampleQuery.Query)
                {
                    var projected = sampleQuery.RowProjection(row);

                    Console.WriteLine("  {0}", projected);
                }
            }

            // Example 2:
            {
                var sampleDescriptor = SampleQueryDescriptors.Default.GetSampleByID;
                // Instruct the descriptor to build its IQueryable:
                var sampleQuery = sampleDescriptor.Construct(null, new OneIDParameter<SampleID>(new SampleID { Value = 15 }));

                // Lets display that IQueryable's Expression:
                Console.WriteLine(sampleQuery.Query.Expression.ToString());

                // Enumerate the query, projecting each row to its final type:
                foreach (object row in sampleQuery.Query)
                {
                    var projected = sampleQuery.RowProjection(row);

                    Console.WriteLine("  {0}", projected.ID.Value);
                }
            }
#endif
            const int queryCount = 250;

            //const string connString = @"tmp.sdf";
            const string connString = @"Data Source=.\SQLEXPRESS;Initial Catalog=Asynq;Integrated Security=SSPI;Asynchronous Processing=true";
            Console.WriteLine("Using '{0}'...", connString);

            var query = ClassEnrollmentQueryDescriptors.Default.GetClassEnrollmentDetailsByProgramEnrollmentID;

            var resultsSync = new List<Tuple<Models.ClassEnrollment, Models.Course, Models.Class, Models.Term, Models.Course, Models.Staff>>[queryCount];
            var resultsAsynq = new List<Tuple<Models.ClassEnrollment, Models.Course, Models.Class, Models.Term, Models.Course, Models.Staff>>[queryCount];

            {
                var queries = new IObservable<List<Tuple<Models.ClassEnrollment, Models.Course, Models.Class, Models.Term, Models.Course, Models.Staff>>>[queryCount];

                Console.WriteLine("Beginning asynchronous Asynq LINQ-to-SQL querying...");

                Stopwatch swTimer = Stopwatch.StartNew();
                for (int i = 0; i < queryCount; ++i)
                {
                    queries[i] = Asynq.ExecuteQuery(
                        // Pass a lambda used to instantiate a new data context per each query:
                        createContext:  () => new Data.ExampleDataContext(connString)
                        // Give the query descriptor:
                       ,descriptor:     query
                        // Give the parameter container struct:
                       ,parameters:     new OneIDParameter<Models.ProgramEnrollmentID>(new Models.ProgramEnrollmentID((i % 11) + 1))
                        // Optional argument used to give an initial expected capacity of the result's List<T>:
                       ,expectedCount:  1
                    );
                }

                Console.WriteLine("Awaiting on Thread ID #{0}...", Thread.CurrentThread.ManagedThreadId);

                // Loop through the queries and pull back each one's results:
                for (int i = 0; i < queryCount; ++i)
                {
                    // First() is blocking here, but the query should most likely already be complete:
                    var rows = queries[i].First();
                    resultsAsynq[i] = rows;

#if TEST
                    Console.WriteLine("#{0,3}) {1} items.", i + 1, rows.Count);
                    foreach (var row in rows)
                    {
                        Console.WriteLine(
                            "      {1}|{2}|{3}|{4}|{5}|{6}|{7}"
                           ,(i + 1)
                           ,row.Item1.ID, row.Item1.Code, row.Item1.Section, row.Item1.CourseID
                           ,row.Item2.ID, row.Item2.Code, row.Item2.Name
                        );
                    }
#endif
                }

                swTimer.Stop();

                Console.WriteLine("Asynchronous Asynq completed {0} queries in {1} ms, average {2} ms/query, {3} queries/sec"
                    , queryCount
                    , swTimer.ElapsedMilliseconds
                    , swTimer.ElapsedMilliseconds / (double)queryCount
                    , (queryCount / (double)swTimer.ElapsedMilliseconds) * 1000d);
            }

            // Synchronous Asynq testing:
            {
                Console.WriteLine("Beginning synchronous Asynq LINQ-to-SQL querying...");

                Stopwatch swTimer = Stopwatch.StartNew();
                for (int i = 0; i < queryCount; ++i)
                {
                    Asynq.ExecuteQuerySync(
                        // Pass a lambda used to instantiate a new data context per each query:
                        createContext:  () => new Data.ExampleDataContext(connString)
                        // Give the query descriptor:
                       ,descriptor:     query
                        // Give the parameter container struct:
                       ,parameters:     new OneIDParameter<Models.ProgramEnrollmentID>(new Models.ProgramEnrollmentID((i % 11) + 1))
                        // Optional argument used to give an initial expected capacity of the result's List<T>:
                       ,expectedCount:  1
                    );
                }
                swTimer.Stop();

                Console.WriteLine("Synchronous Asynq completed {0} queries in {1} ms, average {2} ms/query, {3} queries/sec"
                    , queryCount
                    , swTimer.ElapsedMilliseconds
                    , swTimer.ElapsedMilliseconds / (double)queryCount
                    , (queryCount / (double)swTimer.ElapsedMilliseconds) * 1000d);
            }

#if NonAsyncCompare

            using (var db = new Data.ExampleDataContext(connString))
            {
                Console.WriteLine("Beginning synchronous standard LINQ-to-SQL querying...");

                Stopwatch swTimer = Stopwatch.StartNew();
                for (int i = 0; i < queryCount; ++i)
                {
                    var constructed = query.Construct(db, new OneIDParameter<Models.ProgramEnrollmentID>(new Models.ProgramEnrollmentID((i % 11) + 1)));
                    var rows = constructed.Query.Cast<object>().Select(constructed.RowProjection).ToList();
                    resultsSync[i] = rows;
                }

                swTimer.Stop();

                Console.WriteLine("Sync LINQ-to-SQL completed {0} queries in {1} ms, average {2} ms/query, {3} queries/sec"
                    , queryCount
                    , swTimer.ElapsedMilliseconds
                    , swTimer.ElapsedMilliseconds / (double)queryCount
                    , (queryCount / (double)swTimer.ElapsedMilliseconds) * 1000d
                );
            }
#endif

            // Compare results:
            for (int i = 0; i < queryCount; ++i)
            {
                if (resultsSync[i].Count != resultsAsynq[i].Count) throw new InvalidProgramException();
                
                foreach (var x in resultsSync[i].Zip(resultsAsynq[i], (a, b) => new { a, b }))
                {
                    if (x.a.Item1.ID.Value != x.b.Item1.ID.Value) throw new InvalidProgramException();
                    if (x.a.Item2.ID.Value != x.b.Item2.ID.Value) throw new InvalidProgramException();
                }
            }

            Console.WriteLine("Press a key to end.");
            Console.ReadKey();
        }
    }
Program