none
マルチスレッド処理に対して、Postsharpを使用してメソッド毎の処理時間を計測したい RRS feed

  • 質問

  • PostSharpを使用してログを取得するアスペクトを実装し、そのアスペクトからlogger属性を付加したメソッドの処理時間を

    ロギングしたいと考えております。

    参考ページ↓

    shimolog.net/howtousepostsharp

    参考ページのやり方ですとメソッドの開始時刻と終了時刻はログとして残せますが、処理時間の測定方法がわかりません。

    メソッド内にベタ書きする場合は以下のようにSystem.Diagnostics.Stopwatchを利用したり、

    メソッドの処理終了時にメソッド終了時刻 - メソッド開始時刻の計算をすることで算出可能ですが、

    PostSharpを使ってアスペクトとして実装した場合のメソッド処理時間の算出方法を教えていただきたいです。

    ベタ書きでメソッドの処理時間を計測する場合↓

    hensa40.cutegirl.jp/archives/722

    追記:以下のように実装するとシングルスレッドの場合はうまくいきますがマルチスレッドの場合がうまくいきません。

      [PSerializable]
      class LoggerAttribute : OnMethodBoundaryAspect
      {
            DateTime startDT;
            DateTime endDT;

       public override void OnEntry(MethodExecutionArgs args)
            {

         startDT = DateTime.Now;

             }

            public override void OnExit(MethodExecutionArgs args)
            {

                endDT = DateTime.Now;

                TimeSpan timeSpan = endDT - startDT;
                Console.WriteLine(timeSpan.TotalSeconds);

            }

    }

       [Logger]
        public partial class MainWindow : Window
        {


            public MainWindow()
            {
                InitializeComponent();
            }

           
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                  //PostSharpを使うことでここにOnEntry( )の処理がコンパイル時に追加される。  

         Console.WriteLine("ボタンクリックしたよ");

                  Task.Run(() => Action());

                  //PostSharpを使うことでここにOnExit( )の処理がコンパイル時に追加される。

            }

            public void Action()
            {

                //PostSharpを使うことでここにOnEntry( )の処理がコンパイル時に追加される。

                Thread.Sleep(100);
                

                while (true)
                {
                    Action2( );
                }
               

                //PostSharpを使うことでここにOnExit( )の処理がコンパイル時に追加される。

            }

            public void Action2()
            {

                  Thread.Sleep(200);

                  Console.WriteLine("Action2");

            }

    • 編集済み 訓練兵 2019年8月19日 8:37
    2019年8月19日 7:47

すべての返信