期待どおりに動作していなかった製品コードを修正しました。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 によってサポートされています。タスクを開始するメソッドは、メイン スレッドのタイマーによってトリガーされています。