2013-06-06 29 views
12

Tôi có một ứng dụng WPF được lên lịch trong Task Scheduler.Làm cách nào để thông báo cho Windows Task Scheduler khi ứng dụng của tôi không thành công?

Tôi muốn thông báo cho Task Scheduler khi ứng dụng không thành công.

Trong cửa sổ Task Scheduler, trong phần Task Status tại cột Run Result, tôi luôn nhận được Success, ngay cả khi ứng dụng ném ngoại lệ nội bộ.

Tôi đã sử dụng Application.Current.Shutdown(1) khi cố gắng thông báo không thành công với Task Scheduler, nhưng với tôi đã không thành công.

Làm cách nào để thực hiện điều này?

+0

Bạn đã thử thoát với mã trả về khác 0 mặc định? Xem http://stackoverflow.com/questions/155610/how-do-i-specify-the-exit-code-of-a-console-application-in-net – hatchet

+1

Có, tôi đã thử nhưng tôi luôn luôn thành công. –

+0

có thể trùng lặp của [Windows Task Scheduler trong Win7 nhận ra một nhiệm vụ không thành công như thế nào?] (Http://stackoverflow.com/questions/1335551/how-does-windows-task-scheduler-in-win7-recognize-a-failed -task) – Gabrielius

Trả lời

13

Bạn nên chỉ định mã thoát khác với giá trị mặc định là 0 (có nghĩa là thành công). Bạn có thể làm điều này bằng

Environment.Exit(someNumber) 

Environment.Exit

Bạn sẽ cần phải có một ngoại lệ xử lý toàn cầu để làm việc này cho trường hợp ngoại lệ khác còn tự do. bài viết trên blog này cho biết thêm chi tiết: http://jrich523.wordpress.com/tag/task-scheduler/

EDIT

tôi đã thực hiện một giả định rằng vấn đề là trong ứng dụng của bạn. Bạn biết họ nói gì về các giả định. Vấn đề, nó quay ra là trong thiết kế của Task Scheduler. Như đã chỉ ra ở đây:

How does Windows Task Scheduler in Win7 recognize a failed task?

mà tôi đã xác minh trong thử nghiệm

Windows Task Scheduler không kiểm tra mã thoát hoặc bất kỳ giá trị khác khi nhiệm vụ của bạn hoàn tất. Bạn phải xử lý bất kỳ lỗi nào khi xử lý trong tập lệnh hoặc chương trình của riêng bạn.

Nếu bạn nhìn vào lịch sử cho tác vụ đã lên lịch, bạn sẽ thấy hai sự kiện và Hành động đã hoàn thành, tiếp theo là Tác vụ đã hoàn thành. Nếu bạn kiểm tra các hành động đã hoàn thành, nó sẽ giống như thế này:

Task Scheduler nhiệm vụ hoàn thành "\ test4", dụ "{a41adae0-a378-45f6-aadc-648d27852042}", hành động "C : \ blah..blah \ Release \ WpfApplication1.exe "với mã trả về 55.

Như bạn thấy, ứng dụng đã thoát với mã trả về, nhưng Task Scheduler vẫn nói thành công. Giải pháp duy nhất tôi thấy là tự mình xử lý bằng cách nhấp chuột phải vào mục nhập lịch sử và chọn "Đính kèm tác vụ vào sự kiện này ...".

Hoặc, bạn có thể chạy ứng dụng của mình từ tệp lô và có tệp lô kiểm tra mã thoát và hành động tương ứng. Sau đó, bạn sẽ sử dụng Task Scheduler để lên lịch cho tệp batch thay vì lập lịch trình ứng dụng WPF của bạn trực tiếp.

Về việc trả lại mã thoát khỏi ứng dụng WPF của bạn, bạn có thể cần nhấp chuột phải vào thuộc tính dự án trong Visual Studio và trong tab Ứng dụng, chọn Ứng dụng giao diện cho Loại kết xuất. Ngoài ra, hãy sử dụng bản xây dựng bản phát hành trong Task Scheduler thay vì bản dựng lỗi để đảm bảo rằng mã thoát của ứng dụng của bạn được sử dụng, chứ không phải thứ gì đó được tạo ra từ các công cụ gỡ lỗi được thêm vào. Bạn có thể kiểm tra để xem nếu ứng dụng của bạn được tạo ra đúng một mã lối ra bằng cách làm ít batch file này trong thư mục với file exe của bạn và chạy nó (thay thế tên file exe của ứng dụng của bạn):

wpfapplication1.exe 
echo %errorlevel% 
pause 

mã ban đầu của bạn có thể thiết lập thành công mã thoát, nhưng Shutdown là một lối thoát nhẹ nhàng hơn, và có thể không thoát ngay lập tức (hoặc ở tất cả), vì nó sẽ đợi các luồng vv để thoát ra một cách duyên dáng. Environment.Exit sẽ thoát ra mạnh mẽ hơn.

+0

Tôi đã thử nhưng vẫn nhận được Thành công. –

+0

@AlexandrePerez - xin lỗi vì câu trả lời chưa hoàn chỉnh ban đầu của tôi. Xem chỉnh sửa gần đây của tôi. – hatchet

+10

Tôi không hiểu tại sao Windows Task Scheduler sẽ không tôn trọng giá trị trả về của chương trình đang chạy! – kaptan