アプリケーションのパフォーマンスに関するいくつかのメトリックを構築するために、データベース + 他の関数への関数呼び出しのタイミングを計ることに興味があります。ストップウォッチとメトリクス オブジェクトを使用しましたが、一貫して正しい値が得られないようです。関数を呼び出すための経過時間がすべての呼び出しでまったく同じである場合があり、これは非現実的です...
問題の原因は Metrics オブジェクトのプロパティ値にあることがわかりました。1 つの Metrics オブジェクトの値は、他のスレッドによって生成された Metrics の他のインスタンスに値が割り当てられると上書きされます。各スレッドによって新しいインスタンスが作成されますが、プロパティ値は参照ごとのようです。
複数のスレッドで共有されるオブジェクトで一意性を達成するための最良のアプローチは何ですか?
以下のコード:
private Metrics Metrics;
private Stopwatch Stopwatch;
private int DegreeOfParallelism { get { return Convert.ToInt32(ConfigurationManager.AppSettings["DegreeOfParallelism"].ToString()); } }
var lOptions = new ParallelOptions() { MaxDegreeOfParallelism = DegreeOfParallelism };
Parallel.ForEach(RequestBag, lOptions, (lItem, loopState) =>
{
if (!string.IsNullOrEmpty(lItem.XmlRequest))
{
try
{
Metrics = new Metrics();
Stopwatch = new Stopwatch();
Stopwatch.Start();
ObjRef = new Object();
lItem.XmlRequest = ObjRef.GetDecision(Username, Password);
Stopwatch.Stop();
Metrics.ElapsedTime = string.Format("{0:0.00}", Stopwatch.Elapsed.TotalSeconds);
Stopwatch.Restart();
if (!string.IsNullOrEmpty(DBConnectionString))
{
DataAccess = new DataAccess2(DBConnectionString);
DataAccess.WriteToDB(lItem.XmlRequest);
}
Stopwatch.Stop();
Metrics.DbFuncCallTime = string.Format("{0:0.00}", Stopwatch.Elapsed.TotalSeconds);
}
catch (Exception pEx)
{
KeepLog(pEx);
Metrics.HasFailed = true;
}
finally
{
ProcessedIdsBag.Add(lItem.OrderId);
Metrics.ProcessedOrderId = lItem.OrderId;
Metrics.DegreeOfParallelism = DegreeOfParallelism;
Metrics.TotalNumOfOrders = NumberOfOrders;
Metrics.TotalNumOfOrdersProcessed = ProcessedIdsBag.Count;
pBackgroundWorker.ReportProgress(Metrics.GetProgressPercentage(NumberOfOrders, ProcessedIdsBag.Count), Metrics);
RequestBag.TryTake(out lItem);
}
}
});
どんな助けでも大歓迎です。ありがとう、R