Cách theo dõi chương trình chạy dài theo chương trình


11

Những gì tôi hiện đang có có thể được tóm tắt với mã giả này:

public static void Main(string[] args)
{
    var listOfObjects = Database.GetObjectsToUploadToOnlineService();
    Parallel.ForEach(Upload)
}

private static void Upload(MyUploadObject obj)
{
    //Build object (takes a few milliseconds)
    //Format to JSON (takes a few more milliseconds)
    //Upload (can take up to a max of 10 minutes)
    //Wait for a response (can take up to a max of 10 minutes)
    //Save response to our database (takes a few milliseconds)
}

Chương trình này chỉ được thiết lập trên máy chủ của chúng tôi như một nhiệm vụ theo lịch trình. Chúng tôi sở hữu chương trình và có thể làm những gì chúng tôi muốn với nó. Câu hỏi của tôi bắt nguồn từ một blog về việc thực hiện kiểm tra giám sát tự động (tôi không có liên kết tiện dụng).

Vì vậy, điều đó khiến tôi phải suy nghĩ: Làm thế nào trên thế giới tôi có thể sửa đổi chương trình của mình để tôi có thể khởi động một chương trình "giám sát" khác? Hay điều này nên thay đổi từ việc trở thành một chương trình điều khiển sang nói một chương trình WPF bị ẩn?

Nhìn chung, tôi muốn có thể chạy một chương trình trên máy tính của mình để kiểm tra tiến trình của chương trình qua mạng, vì vậy tôi không phải RDP vào máy chủ để kiểm tra trạng thái của nó (nhưng nó sẽ không là sự kết thúc của thế giới).

Nhìn chung, tôi cho rằng tôi muốn thấy một cửa sổ có nội dung như: Quá trình x của y cho đến nay, các mục sau đây đang được xử lý. Liệt kê các mục trong, như, một bảng và yêu cầu chúng nói như "Đang tải lên" hoặc "Đang chờ phản hồi". Có lẽ nếu tôi phát điên tôi cũng có thể làm thế nào một hàng các mặt hàng thất bại (nhưng đó sẽ chỉ là thêm).

Tâm trí tôi cứ nghiêng về một sự kiện, nhưng tôi không thể hiểu làm thế nào tôi có thể chạy một chương trình có thể đăng ký và hủy đăng ký một chương trình đang chạy. Điều này thậm chí có thể?


Bạn có muốn theo dõi tiến trình bên trong các hoạt động tải lên / phản hồi (kéo dài 10 phút) hay bạn muốn biết có bao nhiêu lần tải lên đã diễn ra trong vòng lặp "Parallel.ForEach"?
Doc Brown

@DocBrown xem chỉnh sửa. (hai đoạn cuối)
Robert Snyder

1
Âm thanh với tôi như những gì bạn muốn có lẽ là một chương trình thu UDP đơn giản. Bạn có thể thả các gói trạng thái trên mạng và nếu không có gì để nhận chúng, thì không có hại gì.
Robert Harvey

Câu trả lời:


7

Những gì bạn cần là một cách để giao tiếp giữa các chương trình của bạn mà không gắn kết chúng với nhau. Có một số cách để thực hiện việc này, bạn có thể thực hiện tác vụ ghi vào tệp và phải theo dõi đọc từ tệp, cung cấp tác vụ qua WCF để màn hình có thể 'thăm dò' các thay đổi, sử dụng mạng ...

Để tránh phát minh lại bánh xe, hãy xem các mục tiêu ghi nhật ký log4net Nếu tôi thực hiện một cái gì đó như thế này, tôi có thể sử dụng log4net và đăng nhập vào UDP hoặc Telnet và để màn hình ở đầu bên kia kết nối với nó. log4net sẽ chăm sóc mọi thứ cho bạn, bao gồm cả việc không ném ngoại lệ khi không có màn hình hoạt động.


Tôi nghĩ rằng tôi không đồng ý với câu trả lời này vì chúng tôi đã sử dụng log4net rất tốt .. đăng nhập :) Vì vậy, điều này sẽ phù hợp với những gì anh ta có. Tôi không có đầu mối log4net có thể làm điều này! Cảm ơn bạn
Robert Snyder

9

Từ ý kiến ​​của bạn, tôi thấy bạn có sẵn cơ sở dữ liệu máy khách / máy chủ và trình tải lên của bạn đã có kết nối và quyền truy cập ghi? Sau đó, có thể dễ dàng nhất để thêm bảng "giám sát" hoặc "trạng thái" vào cơ sở dữ liệu và để trình tải lên của bạn báo cáo tiến trình của nó ở đó (ghi lại từng bước "thú vị" ở đó, có thể là 5 bước bạn đã liệt kê ở trên).

Để xem trạng thái, tạo chương trình thứ hai với GUI, kết nối với cơ sở dữ liệu và hiển thị trạng thái (ví dụ: bằng cách bỏ phiếu trong khoảng thời gian 1 phút). Bạn có thể chạy chương trình đó trên máy tính để bàn cục bộ của mình, giả sử có thể kết nối với cơ sở dữ liệu từ đó.

Tất nhiên, khi viết vào bảng trạng thái can thiệp vào các giao dịch cơ sở dữ liệu của bạn, bạn có thể sử dụng một kết nối riêng. Bạn cũng có thể sử dụng cơ chế xếp hàng tin nhắn như MSQM cho nó, nhưng đó có thể là một giải pháp quá khổ cho trường hợp đơn giản của bạn.


+1 Đây là cách tiếp cận tốt nhất để giữ cho nó đơn giản và không quá phức tạp một cái gì đó không quá phức tạp.
Thomas Stringer

3

Chỉ cần xây dựng dựa trên câu trả lời của @ JDT, một cách phổ biến để làm điều này là viết tin nhắn vào hàng đợi tin nhắn. Bất cứ khi nào điều gì quan trọng xảy ra trong ứng dụng của bạn, nó sẽ viết một tin nhắn và gửi nó đến hàng đợi tin nhắn. Thông thường định dạng của tin nhắn là XML hoặc tương tự. Đó là người viết hàng đợi.

Ứng dụng giám sát đọc (trình đọc hàng đợi) hàng đợi và chọn các tin nhắn và xử lý chúng bằng cách lưu chúng và phân tích tin nhắn so với các tin nhắn hoặc điều kiện trước đó. Nếu một điều kiện được đáp ứng, ứng dụng giám sát sẽ đưa ra cảnh báo biểu thị một vấn đề tiềm ẩn.

Điều này tách ứng dụng của bạn khỏi việc theo dõi chính nó vì nó chỉ bắn đi các tin nhắn. Tùy thuộc vào ứng dụng giám sát để xác định khi nào dựa trên các thông báo hiện tại rằng điều gì đó tốt hay xấu đã xảy ra. Hàng đợi được sử dụng vì chúng cung cấp một phương tiện tốt để lưu trữ các tin nhắn mà không bị mất.

Bạn muốn nhắn tin tập trung nếu có nhiều phiên bản ứng dụng của bạn đang chạy. Nếu chỉ có 1 phiên bản, thì sử dụng các cửa hàng khác như nhật ký sự kiện windows hoặc một tệp có thể là đủ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.