Проблема в охватывающих потоках параллельно в l oop c# - PullRequest
1 голос
/ 22 марта 2020

У меня есть код ниже для вызова метода ThreadPro c в нескольких потоках. ResultCallback - это метод обратного вызова. ThreadPro c вызывает хранимую процедуру и возвращает записи и набор данных форм. набор данных передается обратно в ResultCallback, где я хочу дополнительно обработать эти записи.

 int count = 30000;
 int start = 1;
 int batch = 10000;
 var tasks = new List<Task>();
while (start <= count)
        {
            var s = start;
            var b = start + (batch - 1);
            Console.WriteLine("Processing records from {0} to {1}", s, b );
            tasks.Add(Task.Run(() =>
            {
                new MyClass().ThreadProc(s, b,new ExampleCallback(ResultCallback));
            }));
            start += batch;
        }

        await Task.WhenAll(tasks);

Метод обратного вызова равен

 public static void ResultCallback(DataSet ds, int start)
    {
        Console.WriteLine(
            "Finished processing batch starting with {0}. " +
            "Processed batch started with org id {1} lines.", start, ds.Tables[0].Rows[0][0]);
    }

проблема здесь в том, что в SSMS для возврата 40000 записей хранимая процедура занимает 7 минут. в моей многопоточной программе я охватил 4 потока каждый, чтобы вернуть 10000 записей. это по-прежнему занимает 7 минут, указывая, что 4 потока ведут себя как один отдельный поток.

Я ожидаю, что, поскольку я делю размер записи до 10000 на поток, общее время для получения 40000 записей должно составлять 7 минут. 4. примерно 2 мин. почему этого не происходит?

ниже приведен код метода ThreadPro c

 public void ThreadProc(int start, int batch, ExampleCallback callbackDelegate)
    {
        DataSet dataset = new DataSet();

        using (SqlConnection con = new SqlConnection(connectionString))
        {
            SqlCommand cmd = new SqlCommand("proc_D", con);
            cmd.CommandType = CommandType.StoredProcedure;

            //the 2 codes after this comment is where you assign value to the parameters you
            //have on your stored procedure from SQL
            cmd.Parameters.Add("@Start", SqlDbType.Int).Value = start;
            cmd.Parameters.Add("@Batch", SqlDbType.Int).Value = batch;

            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.SelectCommand.CommandTimeout = 18000;
            da.Fill(dataset); //this is where you put values you get from the Select command to a 
                              //dataset named ds, reason for this is for you to fetch the value from DB to code behind

        }
        if (callback != null)
            callback(dataset, start);

        Console.WriteLine(this.start);
    }

Как заставить потоки работать параллельно и получить все выходные данные за 10 се c of 30 se c.

Заранее спасибо.

========================== ====== Обновление:

Я сравниваю результаты, я пытался вызывать один и тот же метод синхронно и асинхронно (с помощью задач). ниже приведен код

syn c код

 while (start <= count)
        {

            MyClass1 obj = new MyClass1(start, batch, new ExampleCallback1(ResultCallback));
            obj.ThreadProc();

            start += batch;
        }

asyn c

while (start <= count)
        {
            var i = 0;
            var s = start;
            var b = batch;
            //Account Number
            tasks = new[]
            {
                Task.Factory.StartNew(() =>
                {
                    MyClass sdse = new MyClass1();
                    var data = new MyClass2( connectionString);
                    data.ThreadNum = Thread.CurrentThread.ManagedThreadId;
                    data.ThreadProc(s, b, new ExampleCallback(sdse.EncryptMethod));
                    ////Console.WriteLine("Processed records from {0} to {1} on thread #{2}.",
                    //                  s, s + (b - 1), data.ThreadNum);
                })
   }
}

я вижу, что вызов syn c получает результаты за меньшее время, когда asyn c вызов занимает больше времени.

не уверен, что я здесь не так делаю.

...