3

.NET 4.0 の Task Parallel Library を ADO.Net と共に使用すると問題が発生します。それぞれに 2 つの個別のタスクを作成して、2 つのストアド プロシージャを並行して実行しようとしています。シナリオは次のようなものです。最初のストアド プロシージャの実行には 20 秒かかり、もう 1 つのストアド プロシージャの実行には約 12 秒かかります。コードを実行すると、実行にかかる時間はこれら 2 つの期間の合計になります (つまり、20 + 12 = 32 秒)。 .これは私が期待しているものではありません.私が想定しているのは、最初のストアドプロシージャの実行が終了するまでに、2番目のストアドプロシージャはすでに終了しているため、実行にかかる合計時間は約20秒になるはずです.私のコードでは、ADO.Netセクションを単に

Thread.Sleep(時間)

つまり、20 秒と 12 秒の 2 つのスレッドを設定すると、プログラムは 20 秒以内に実行されます。これは、ADO.Net を使用して達成しようとしている動作と同じです。また、私がこれらの声明を持っている場合、

IAsyncResult result1 = cmd1.BeginExecuteReader();
IDataReader reader1 = cmd1.EndExecuteReader(result1);

ストアド プロシージャの 1 つについては、期待どおりの動作が得られます。しかし、同じことを他のストアド プロシージャの結果に適用すると、プログラムは順次実行されます。私はこの行動について混乱しています。したがって、私が探している結果を達成するために私を助けるようにあなたに依頼してください. ここに完全なコードを添付しています。どこが間違っているのか教えてください。

 string connectionString1 = ConfigurationManager.ConnectionStrings["ConnectionString1"].ConnectionString;
    string connectionString2 = ConfigurationManager.ConnectionStrings["ConnectionString2"].ConnectionString;
    string connectionString3 = ConfigurationManager.ConnectionStrings["ConnectionString3"].ConnectionString;
    List<int> results = new List<int>();
    Dictionary<string, int> dict = new Dictionary<string, int>();

    List<SqlDataReader> rdrs = new List<SqlDataReader>();

    public List<int> returnSelect()
    {

        var taskIndex = -1;
        var start = DateTime.Now;
        Task[] tasks = new Task[]
        {
            Task.Factory.StartNew(() => PrintNumber1()),
            Task.Factory.StartNew(() => PrintNumber2()),
            Task.Factory.StartNew(() => PrintNumber3())
        };
        Dictionary<int, DateTime> taskList = new Dictionary<int, DateTime>();
        while (tasks.Length > 0)
        {
            taskIndex = Task.WaitAny(tasks);
            for (int i = 0; i < tasks.Count(); i++)
            {
                Console.Write("Array {0} | ", tasks[i].Id);

            }
            taskList.Add(tasks[taskIndex].Id, DateTime.Now);
            tasks = tasks.Where((t) => t != tasks[taskIndex]).ToArray();
        }
        var end = DateTime.Now;
        var diff = end - start;
        int count = rdrs.Count;
        int dcount = dict.Count;
        return results;

    }

    //19
    public void PrintNumber1()
    {
        SqlConnection con1 = new SqlConnection(connectionString1);
        {
            var start = DateTime.Now;
            var copen = DateTime.Now;

            var cclose = DateTime.Now;
            int exSec = (cclose - copen).Seconds;
            SqlCommand cmd1 = new SqlCommand("PS_Brand_level", con1);
            cmd1.CommandType = CommandType.StoredProcedure;
            cmd1.Parameters.AddWithValue("@startdate", "6/25/2012");
            cmd1.Parameters.AddWithValue("@enddate", "11/18/2012");
            cmd1.Parameters.AddWithValue("@subbrands", "mybrands");
            cmd1.Parameters.AddWithValue("@count", 11);
            cmd1.Parameters.AddWithValue("@category", "a");
            con1.Open();
            IAsyncResult result1 = cmd1.BeginExecuteReader();
            IDataReader reader1 = cmd1.EndExecuteReader(result1);
            var end = DateTime.Now;
            dict.Add((end - start).ToString(), 1);
        }

        /*var start = DateTime.Now;
        Thread.Sleep(19000);
        var end = DateTime.Now;
        dict.Add((end - start).ToString(), 1);*/
    }


    //9
    public void PrintNumber2()
    {

        SqlConnection con2 = new SqlConnection(connectionString2);
        {
            var start = DateTime.Now;
            var copen = DateTime.Now;
            con2.Open();
            var cclose = DateTime.Now;
            int exSec = (cclose - copen).Seconds;
            DataSet dtPSPercentage = new DataSet();
            SqlCommand cmd2 = new SqlCommand("Ps_Percentage", con2);
            cmd2.CommandType = CommandType.StoredProcedure;
            cmd2.CommandTimeout = 100;
            cmd2.Parameters.AddWithValue("@startdate", "6/25/2012");
            cmd2.Parameters.AddWithValue("@enddate", "11/18/2012");
            cmd2.Parameters.AddWithValue("@subbrands", "mybrands");
            cmd2.Parameters.AddWithValue("@category", "a");

            IAsyncResult result2 = cmd2.BeginExecuteReader();
            IDataReader reader2 = cmd2.EndExecuteReader(result2);
            var end = DateTime.Now;
            dict.Add((end - start).ToString(), 2);
        }

        /*var start = DateTime.Now;
        Thread.Sleep(9000);
        var end = DateTime.Now;
        dict.Add((end - start).ToString(), 2);*/
    }

    //12
    public void PrintNumber3()
    {

        SqlConnection con3 = new SqlConnection(connectionString3);
        {
            var start = DateTime.Now;
            var copen = DateTime.Now;
            //con3.Open();
            var cclose = DateTime.Now;
            int exSec = (cclose - copen).Seconds;
            SqlCommand cmd1 = new SqlCommand("Ps_Aggregated", con3);
            cmd1.CommandType = CommandType.StoredProcedure;
            cmd1.Parameters.AddWithValue("@startdate", "6/25/2012");
            cmd1.Parameters.AddWithValue("@enddate", "11/18/2012");
            cmd1.Parameters.AddWithValue("@subbrands", "mybrands");
            cmd1.Parameters.AddWithValue("@category", "a");

           // IAsyncResult result1 = cmd1.BeginExecuteReader(CommandBehavior.SingleRow);
            //SqlDataReader reader1 = cmd1.EndExecuteReader(result1);
            var end = DateTime.Now;
            dict.Add((end - start).ToString(), 3);


        }

        /*var start = DateTime.Now;
        Thread.Sleep(12000);
        var end = DateTime.Now;
        dict.Add((end - start).ToString(), 3);*/


    }

ありがとうございます。それでは、お元気で

4

0 に答える 0