2

久しぶりの読者投稿です。

Windows サービスに移動する前に、100% 正常に機能する Windows フォーム アプリケーション内で動作するファイルウォッチャーを作成しましたが、現在 2 つの個別の問題が発生しています。このファイル ウォッチャーは、行更新用のフラットファイルを読み取り (lastwrite)、ファイルを削除/再作成し (streamwriter)、最後に厳密に型指定されたデータ セットを解析してから、SQL サーバーにアップロードします。(これは私の最初の Windows サービスです) 質問:
1. filewatcher の二重イベント トリガーは、フォーム アプリケーションとは異なる方法でサービスに影響を与えますか?
2.私が呼び出しているクラスに問題がない場合、スレッドが壊れる理由について誰か答えがありますか?
3. Windows サービスを介した Windows 認証に関する既知の問題はありますか?
4. Windows サービスの強力なデバッグ方法を持っている人はいますか?

これがWindowsサービスからの私のコードです。コードにばかげた間違いがある場合は、事前に感謝し、謝罪します。これも初めてWindowsサービスを作成します。

    FileMonitor m_FileMonitor;
    public WindowsService()
    {
        InitializeComponent();
    }
    protected override void OnStart(string[] args)
    {
            try
            {
                Thread myThread = new Thread(DoTheWork);
                myThread.Start();
            }
            catch
            {

            }

    }
    void DoTheWork()
    {
        m_FileMonitor = new FileMonitor(Properties.Settings.Default.PathToFileToWatch, Properties.Settings.Default.PathToErrorLog);
    }
    protected override void OnStop()
    {
        // TODO: Add code here to perform any tear-down necessary to stop your service.
    }
4

2 に答える 2

2

デバッグの場合、プロジェクトの種類が Windows アプリケーションであることを確認してから、これを使用します。

[DllImport("kernel32")]
static extern bool AllocConsole();

private static void Main(string[] args)
{
    var service = new MyService();
    var controller = ServiceController.GetServices().FirstOrDefault(c => c.ServiceName == service.ServiceName);
    if (null != controller && controller.Status == ServiceControllerStatus.StartPending)
    {
        ServiceBase.Run(service);
    }
    else
    {
        if (AllocConsole())
        {
            service.OnStart(args);
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
            service.OnStop();
        }
        else
        {
            throw new Win32Exception(Marshal.GetLastWin32Error());
        }
    }
}

Windows サービスが開始されたためにコードが実行されている場合は、Windows サービスとして実行されます。それ以外の場合は、コンソールを割り当て、サービスを実行し、キーが押されるのを待ってからサービスを終了します。これに基づいて、一時停止と続行をテストできます。

于 2012-04-04T23:33:03.473 に答える
0

デバッグの場合:

ServiceBase.RunWindows サービスとして実行するには のメソッドを使用するMain()必要がありますが、main メソッドで切り替えを行って、通常のコンソール アプリケーションと同じアプリケーションを実行することができます (例: --standalone)。私はすべてのサービスでこれを使用して、デバッグを容易にしています。

その他の問題について:

あなたが遭遇した問題と、「クラスブレイク」と「ダブルイベントトリガー」の意味が完全にはわかりません.

Windows サービスは特別なサービス アカウントで実行されます。このサービス アカウントには、対象のディレクトリを監視する権限がある場合とない場合があります。必要に応じて、サービス アカウントを変更するか、ディレクトリに対する権限を与えることができます。

リンク:

File Watcher Windows サービスを実装していると思われる codeproject 記事へのリンクを次に示します。多分それは役立ちます:

http://www.codeproject.com/Articles/18521/How-to-implement-a-simple-filewatcher-Windows-serv

于 2012-04-04T23:09:08.620 に答える