0

期待どおりに動作していなかった製品コードを修正しました。C# で記述された .NET 4.5.1 の Windows サービスについて話しています。修正されていますが、何が起こったのか理解しようとしています。一部のグーグルは、これについてあまり結果を示しませんでした。次のようにタスクが開始されました。

var task = Task.Factory.StartNew(this.SendReminders);
 logger.Info("Waiting for sending to complete...");
 task.Wait();

私の知る限り、スレッドと同様に、StartNew は実行するメソッドへの参照を受け取ります。これはデバッグ環境では機能しますが、本番環境 (リリース) では機能しません。次のようにしました。

 var task = Task.Factory.StartNew(() => this.SendReminders());
 logger.Info("Waiting for sending to complete...");
 task.Wait();

ここで何が欠けていますか?コードはまったく実行されないように最適化されていますか?

要求に応じて、タスク メソッドの本体:

    internal void SendReminders()
    {
        using (this.container.BeginLifetimeScope())
        {
            try
            {
                var uow = container.GetInstance<UnitOfWork>();

                this.logger.Info("Sending reminders..");

                var handler = container.GetInstance<IHandleCommand<SendReminderCommand>>();
                handler.Handle(new SendReminderCommand());
                uow.SaveChanges();

            }
            catch (Exception ex)
            {
                this.logger.Exception(ex);

                throw;
            }
        }
    }

これまでのところ、例外はログに記録されておらず、サービスは実行されていました。Task.Factory.StartNew(this.SendReminders) 行を使用しても本番環境では起動しませんでしたが、ラムダを使用すると魅力的に機能しました。

私は SimpleInjector を使用しており、UnitOfWork は Entity Framework 6.0.2 によってサポートされています。タスクを開始するメソッドは、メイン スレッドのタイマーによってトリガーされています。

4

1 に答える 1