私が書いたいくつかのコードは次のとおりです。
これは、メソッド呼び出しの期間を非同期的に記録する目的で PostSharp アスペクトをメソッドに適用する方法を示しています。これにより、ロギング プロセスが遅い場合、アスペクトで修飾されたメソッドの呼び出し元にはこのパフォーマンス ペナルティが見られません。 .
MyFirstMethod が完了し、ロギング メソッドが別のスレッドでオフに設定され、MySecondMethod が並行して実行されているため、機能しているようです。これは、非常にトラフィックの多い Web アプリケーション (高度にマルチスレッド化された環境) 内のメソッドを同様のインストルメンテーションで装飾するというものです。
そうすることの落とし穴は何ですか?(たとえば、いつでも許可されるスレッド数の制限に達することを懸念しています)。
using System;
using System.Threading.Tasks;
using NUnit.Framework;
using PostSharp.Aspects;
namespace Test
{
[TestFixture]
public class TestClass
{
[Test]
public void MyTest()
{
MyFirstMethod();
MySecondMethod();
}
[PerformanceInstrument]
private void MyFirstMethod()
{
//do nothing
}
private void MySecondMethod()
{
for (int x = 0; x < 9999999; x++);
}
}
[Serializable]
public class PerformanceInstrument : MethodInterceptionAspect
{
public override void OnInvoke(MethodInterceptionArgs args)
{
var startDtg = DateTime.Now;
args.Proceed();
var duration = DateTime.Now - startDtg;
Task.Factory.StartNew(() => MyLogger.MyLoggingMethod(duration)); //invoke the logging method asynchronously
}
}
public static class MyLogger
{
public static void MyLoggingMethod(TimeSpan duration)
{
for (int x = 0; x < 9999999; x++);
Console.WriteLine(duration);
}
}
}