私はデスクトッププログラムでビジネスロジックを処理しています。処理速度を上げるためにWebサービスでマルチスレッド化
しかし、大きなデータで処理するとデータ処理がひどく遅くなります(MS SQLデータベースを使用しています)。それで、私は回避策を講じます。
`
DataTable dtEmp = new DataTable("Employee");
if (cn.State == ConnectionState.Closed)
{
cn.Open();
}
using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sEmpQuery, cn))
{
Console.Write(string.Format("Command Text:{0}", sEmpQuery));
cmd.Parameters.AddWithValue("Period", sPeriod);
dtEmp.Load(cmd.ExecuteReader());
}
if (cn.State == ConnectionState.Open)
{
cn.Close();
}
Int32 iThread;
iThread = iNoThread;
Int32 iCountTable;
iCountTable = dtEmp.Rows.Count;
Console.WriteLine(string.Format("Total Rows:{0}", iCountTable));
Int32 IProcNum;
IProcNum = iCountTable/iThread;
Console.WriteLine(string.Format("Transaction no:{0}", IProcNum));
if (iCountTable < iThread)
{
Boolean bl;
AutoHRPay.frmClosePeriod aPay= new AutoHRPay.frmClosePeriod();
MiscResource AMisc = new MiscResource();
MiscResource misc = new MiscResource();
misc.SetDBConn(strCN);
}
else
{
Boolean[] bl = new Boolean[iThread];
object locker = new object();
Parallel.For(1, iThread + 1, i =>
{
System.Text.StringBuilder strSQL = new System.Text.StringBuilder();
strSQL.Append("(");
DataTable dtEmpThread = dtEmp.Clone();
dtEmpThread.Clear();
for (Int32 j = ((i - 1) * IProcNum + 1); j <= ((i != iThread) ? (IProcNum * i) : iCountTable); j++)
{
dtEmpThread.ImportRow(dtEmp.Rows[j-1]);
}
int row_counter = 0;
lock (locker)
{
row_counter++;
streamwriter.WriteLine("Processing row: {0}", row_counter);
}
ConsoleAttn aPay = new ConsoleAttn();
aPay.runConsole();
});
}
streamwriter.Close();
return "Completed.";
:私は以下のコードのように過去ログTask.Parallelのtechonologyと、いくつかのスレッドに処理を分ける、その後、)(Webサービスプロジェクトを開き、およびDLL名consoleAttnに私のビジネスロジックプロセスをパッケージ化
1)プロセスを停止する必要があるとき、またはWebサービスを呼び出したクライアントが崩壊するときに、非同期プロセスをどのように行うべきですか?