У меня есть код ниже для вызова метода 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 вызов занимает больше времени.
не уверен, что я здесь не так делаю.