私は次のような構成があります:最初のオープンデータベース接続に使用パラレルforeachのタイムアウト優雅に近いすべてのワーカースレッド
Parallel.ForEach(Program.config.Root.Elements("databases"), el =>
{
try
{
DBConnection.OpenConnection(el.Attribute("database_alias").Value);
}
catch (Exception exc)
{
WriteLog(10, exc);
}
});
この構造を。しかし、第三者コンポーネントの反復のために、アプリケーション全体でハングすることがあります。そこで、私たちは補完を改善し、新しいものを手に入れます:
Parallel.ForEach(Program.config.Root.Elements("databases"), el =>
{
try
{
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(DBConnection.OpenConnection));
t.Start(el.Attribute("database_alias").Value);
// Handling 50 seconds timeout
if (!t.Join(50000))
{
t.Abort();
// Force closing because connection is hanging with "connecting" state
Program.myConnections[el.Attribute("database_alias").Value].Conn.Close();
}
}
catch (Exception exc)
{
WriteLog(10, exc);
}
});
しかし、今でも私たちは時間内に生きているスレッドを持っています。私は彼らがタスクマネージャーの金額を数えるのを見ることができます。誰もそれをどう管理するか知っていますか? ありがとうございます!
を使用して 'Thread.Abort() '普通良い考えではない。他の方法で接続をキャンセルできませんか?また、Visual Studioデバッガのアクティブなスレッドは表示されないはずですか? – svick
@svickそうは思わない。それはちょうど[Connection.Open()](http://www.devart.com/dotconnect/oracle/docs/Devart.Data.Oracle~Devart.Data.Oracle.OracleConnection.html)メソッドにぶら下がっています。 – kseen
'ConnectionTimeout'の値は何ですか? 'Thread.Abort()'の代わりにそれを設定できませんか? – svick