1)タスクスケジューラがエラーを返す
毎日0800に.exeを起動するようにタスクスケジューラに登録して、次の日確認してみたら案の定動いてませんでした。翌日、その次の日も結局動かずで。タスクスケジューラの管理画面を見ると、どうやら2147750692というエラーで止まっているようです(下の写真参照)。
こんなエラーが出ました |
ネットで調べてみると、2147750692というエラーコードは
The Task Scheduler service attempted to run the task, but the task did not run due to one of the constraints in the task definition.
とのこと。はあ、つまり何らかの理由で動かんかったよ、と。原因が絞れないですね…
とりあえず、「タスクスケジューラ」手動でタスクをスケジュールする方法<Windows Vista(R)>: dynabook.comサポート情報を参考にして、タスクの設定を変えてみます。結局動かずじまいでした。
2)テストしたら'System.InvalidOperationException' のハンドルされていない例外が System.Windows.Forms.dll で発生しました。って出た
で、タスクスケジューラは試しにその場でタスクを実行できるので、やってみたところ「デバッガを起動しますか?」とダイアログが出たので、VS2008を起動してみたら上記の例外が発生していたみたいです。
こんな感じで、タスク上を右クリックで[実行する]メニューが出てくる~~~~ |
上記の例外の全文は
'System.InvalidOperationException' のハンドルされていない例外が System.Windows.Forms.dll で発生しました。
アプリケーションが UserInteractive モードで実行されていないときに、モーダル ダイアログまたはフォームを表示することは有効な操作ではありません。サービス アプリケーションからの通知を表示するには、ServiceNotification または DefaultDesktopOnly スタイルを指定してください。
です。要はタスクスケジューラから起動するときはフォームとかMessageBox使わないでねってことなんですかね…"UserInteractiveモード(ユーザ対話モード)"の定義がなかなか見つかりませんでして…
で、そうなるとプログラムを修正しないといけなくて、実はUserInteractiveモードか否かは
boolean IsUserInteractive = Environment.UserInteractive;というコードで取得できるみたいなので、
[STAThread] static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); if (Environment.UserInteractive) { //UserInteractiveモードなので表示 Application.Run(new Form1()); } else { //UserInteractiveモードじゃないときは、ここでUIを使わないコードをごにょごにょ } }
というコード書いて、Main()でFormを表示する前に分岐させてみました。というお話。動いてくれるといいな…(動作確認してない)