2009-11-23 20 views
7

Có cách nào tôi có thể xác định hồ bơi ứng dụng (trong IIS7) kéo dài bao lâu (thời gian bắt đầu hoặc khởi động lại lần cuối) trong C#?Nhận hồ sơ ứng dụng Thời gian hoạt động trong C#

+0

Bên ngoài hoặc trong ứng dụng ASP.NET của bạn? –

+0

Bên ngoài. Tôi đã chơi xung quanh với Microsoft.Web.Administration.ApplicationPool, nhưng tôi không thấy bất cứ điều gì như xa như thời gian. – JPero

Trả lời

5

lừa Thật ngu ngốc: trong một số lớp học mà tất cả mọi thứ sử dụng, sử dụng một constructor lớp nhớ thời gian bắt đầu của bạn và sử dụng trang aspx để nhận nó. Bây giờ so sánh với thời gian hiện tại.

+0

Bởi constructor lớp bạn có nghĩa là 'static' constructor?Bởi vì constructor tĩnh là những gì bạn muốn làm với điều này, tôi chưa bao giờ xem xét cách dễ dàng bạn có thể sử dụng một constructor tĩnh để đạt được một cái gì đó như thế này trước khi mặc dù. –

+0

Hàm tạo lớp trong hàm IL = static constructor trong C#. – Joshua

+0

AppDomain có thể được tái chế (thay đổi web.config) mà không có hồ bơi ứng dụng đang được tái chế (quá trình w3wp.exe). Phương thức khởi tạo tĩnh này sẽ chỉ đo khởi động lại appdomain mới nhất. Sử dụng câu trả lời thông tin câu trả lời (@EricHumphrey) nếu bạn thực sự cần thời gian bắt đầu quá trình hồ bơi ứng dụng. – yzorg

3

Từ ứng dụng ASP.NET, bạn có thể thử TimeSpan uptime = (DateTime.Now - ProcessInfo.GetCurrentProcessInfo().StartTime)

8

DateTime.Now -. Process.GetCurrentProcess() StartTime

Process.GetCurrentProcessInfo() không tồn tại.

+0

Thật thú vị, điều này tồn tại một ứng dụng khởi động lại, vì vậy tôi không chắc chắn chính xác như thế nào. –

2

nếu bạn thấy rằng Process.GetCurrentProcessInfo() không tồn tại như một người dùng khác đề cập,

System.Diagnostics.Process.GetCurrentProcess().StartTime 

có thể làm việc cho bạn.

(Tôi muốn thêm này như là một lời nhận xét bài Eric Humphrey của nhưng tôi không được phép)

1

Dựa trên trên, chúng tôi đã tạo ra một lớp đơn giản như vậy ..

public static class UptimeMonitor 
{ 
    static DateTime StartTime { get; set; } 

    static UptimeMonitor() 
    { 
     StartTime = DateTime.Now; 
    } 

    public static int UpTimeSeconds 
    { 
     get { return (int)Math.Round((DateTime.Now - StartTime).TotalSeconds,0); } 
    } 
} 

và gọi nó trong Application_Start() trong Global.asax.cs như

var temp = UptimeMonitor.UpTimeSeconds; 

sau đó nó có thể được truy cập bất cứ nơi nào sử dụng

UptimeMonitor.UpTimeSeconds 
0

Một trong hai cách tiếp cận tồn tại mà cá nhân tôi sử dụng. Sử dụng lớp tĩnh (như được hiển thị trong câu trả lời của @ Original10) hoặc sử dụng các biến số Application.

Tôi nhận thấy rằng việc sử dụng các biến số Application có thể chấp nhận được vì tôi nhận thấy khởi động lại ứng dụng Process.GetCurrentProcess() còn sống sót (ví dụ: sửa đổi web.config hoặc thư mục bin). Tôi cần một cái gì đó sẽ phục vụ cho trang web khởi động lại cũng như.

Trong Global.asax của bạn, thêm dòng sau vào

public void Application_Start(Object sender, EventArgs e) 
{ 
    ... 
    Application["ApplicationStartTime"] = DateTime.Now.ToString("o"); 
} 

Trong code của bạn, nơi bạn cần đến nó, bạn có thể làm một cái gì đó như:

var appStartTime = DateTime.MinValue; 
var appStartTimeValue = Web.HttpCurrent.Application["ApplicationStartTime"].ToString(); 

DateTime.TryParseExact(appStartTimeValue, "o", null, Globalization.DateTimeStyles.None, Out appStartTime); 
var uptime = (DateTime.Now - appStartTime).TotalSeconds 

var lsOutput = $"Application has been running since {appStartTime:o} - {uptime:n0} seconds." 

Mà sẽ sản xuất cái gì đó dọc theo dòng

Application has been running since 2018-02-16T10:00:56.4370974+00:00 - 10,166 seconds. 

Không có kiểm tra biến ứng dụng hoặc khóa ứng dụng nếu yêu cầu d. Tôi sẽ để điều này như một bài tập cho người dùng.

Các vấn đề liên quan