3

実行時間の長い Windows サービスを作成しようとしているので、実際のワーカー クラスを別のスレッドで実行して、右クリックして Windows サービスで開始を選択したときに「サービスがタイムリーに応答しませんでした」というエラーを回避する必要があります。マネジャー。

ワーカー クラス ("NotificationProcess") には多数の依存関係があり、これらを満たすために Autofac を使用しています。

ワーカー クラスに Autofac を設定する方法がよくわかりません。現時点では、ワーカー クラスの「Execute」メソッドで DbContext を使用しようとすると、DbContext が破棄されたというエラーが表示されます。

Windows サービスを記述し、autofac によって満たされた依存関係を持つワーカー クラスに新しいスレッドを使用する方法を探していると思います。

私はグーグルで検索しましたが、この例は見つかりません。

どんな提案も素晴らしいでしょう。

これが私がこれまでに持っているものです...

Program.cs:

    static class Program
{
    static void Main()
    {
        using (var container = ServiceStarter.CreateAutoFacContainer())
        {
            var service = container.Resolve<NotificationService>();
            if (Environment.UserInteractive)
            {
                service.Debug();
            }
            else
            {
                ServiceBase.Run(container.Resolve<NotificationService>());
            }
        }

サービス クラス:

public partial class NotificationService : ServiceBase
{
    private NotificationProcess _app;
    readonly ILifetimeScope _lifetimeScope;

    public NotificationService(ILifetimeScope lifetimeScope)
    {
        _lifetimeScope = lifetimeScope;
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        _app = _lifetimeScope.Resolve<NotificationProcess>();
        _app.Start();
    } 

ワーカークラス:

    public class NotificationProcess
{
    private Thread _thread;

    private readonly IBankService _bankService;
    private readonly IRateService _rateService;
    private readonly IEmailService _emailService;
    private readonly IRateChangeSubscriberService _rateChangeSubscriberService;
    private readonly IRateChangeNotificationService _rateChangeNotificationService;
    private readonly ILogManager _logManager;

    public NotificationProcess(IBankService bankService, ILogManager logManager, IRateService rateService, IEmailService emailService, 
        IRateChangeSubscriberService rateChangeSubscriberService, IRateChangeNotificationService rateChangeNotificationService)
    {
        _bankService = bankService;
        _rateService = rateService;
        _emailService = emailService;
        _rateChangeSubscriberService = rateChangeSubscriberService;
        _rateChangeNotificationService = rateChangeNotificationService;
        _logManager = logManager;
    }

    public void Start()
    {
        _thread = new Thread(new ThreadStart(Execute));
        _thread.Start();
    }

    public void Execute()
    {
        try
        {
            var rateChangeToNotify = _rateService.GetRateChangesForNotification();

            foreach (var rateChange in rateChangeToNotify)
            {
                 //do whatever business logic.....
            }
        }
    }
4

1 に答える 1