静的クラス/メソッドに現在あるコードがいくつかありますが、それがスレッドセーフであることを確認したいと思いました。私が読んだことから、これは大丈夫だと思いますが、私の心の奥にある何かがそうではないかもしれないと言っています。私のWebページのデータ処理段階では、外部Webサービスを使用して注文レコードを作成しますが、これは非常に遅くなる可能性があります。おそらく30〜40秒から5分または10分(これは私の手に負えない)なので、起動します。リターンページをユーザーに戻し、新しいスレッドを開始し、処理が完了したらユーザーに電子メールを送信します。これは現在、静的クラス/メソッドにあります。すべてのオブジェクトが特定のメソッド内で作成されている場合(一般的なシステムのデフォルト値を除く)、そのメソッドはスレッドセーフである必要があります。だから、例えば、私が持っていた場合
public static class ProcessOrder()
{
public static int GetOrderMaxSize()
{
return (....gets and parses ConfigurationManager.AppSettings["MaxOrderSize"]...);
}
public static bool CreateOrder(Order order)
{
XmlDocument xmlDoc = GetOrderXML(order);
bool check = false;
using (CreateOrderXML.Create xmlCo = new CreateOrderXML.Create())
{
xmlCo.Timeout = 60000;
System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
string xmlString = "";
using (StringWriter stringWriter = new StringWriter())
{
using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter))
{
xmlDoc.WriteTo(xmlWriter);
xmlWriter.Flush();
xmlString = stringWriter.GetStringBuilder().ToString();
}
}
byte[] bXMLOrder = encoding.GetBytes(xmlString);
byte[] breturnMessage;
check = xmlCo.Create(bXMLOrder, out breturnMessage);
.... do something with return message
}
return check;
}
private static XmlDocument GetOrderXML(Order order)
{
... creates an XML object for the order
}
}
(CreateOrderXMLはWebサービスのURL /メソッドへのサービス参照です)特に長時間実行(主にxmlCo.Create(....)ステージ)の並行スレッドの場合、スレッドセーフでしょうか?クラスメンバーを入れ始めてメソッドで使用すると、異なるスレッドが値を上書きするという問題が確実に発生することを理解していますが、オブジェクトがメソッド内で作成されている限り、オブジェクトは問題ありません。彼ら?