2012-07-05 30 views
5

Gần đây tôi đã làm việc trên máy phát hình ảnh động aspx trong C#, cơ bản nhất, lấy giá trị chuỗi truy vấn từ "t" và ghi chuỗi đó vào hình ảnh, sau đó trả về JPG.Máy phát hình ảnh C# - Hiệu suất chậm

Nó hoạt động hoàn hảo tại địa phương và trên máy chủ thử nghiệm - hình ảnh được trả về ngay lập tức.

Nhưng khi trên máy chủ trực tiếp cân bằng tải, đôi khi nó hoạt động tốt. Nhưng thường xuyên hơn thời gian chờ/mất đến một phút để trả lại hình ảnh.

Tôi nghĩ tôi sẽ hỏi ở đây nếu có bất kỳ điều gì rõ ràng trong mã của tôi có thể gây ra sự cố, trước khi tôi chuyển sang các nhà khai thác máy chủ để hỏi tại sao điều này không hoạt động tốt.

Dưới đây là một phiên bản rất tinh gọn của máy phát điện (mà cũng có những vấn đề chính xác cùng một thời gian chờ)

protected void Page_Load(object sender, EventArgs e) 
{ 

    // Set global stage dimensions 
    const int stageWidth = 500; 
    const int stageHeight = 200; 

    // Create Bitmap placeholder for new image  
    Bitmap createdImage = new Bitmap(stageWidth, stageHeight); 

    // Draw new blank image 
    Graphics imageCanvas = Graphics.FromImage(createdImage); 

    // Add text 
    if (!string.IsNullOrEmpty(Request.QueryString["t"])) 
    { 
     string imageText = Uri.UnescapeDataString(Request.QueryString["t"]).Trim(); 
     Font font = new Font("Arial", 22); 
     imageCanvas.DrawString(imageText, font, Brushes.White, 0, 0);    
    } 

    // Save 
    MemoryStream memStream = new MemoryStream(); 
    createdImage.Save(memStream, ImageFormat.Jpeg); 
    imageCanvas.Dispose(); 
    createdImage.Dispose(); 

    // Set filename/image format 
    Response.AppendHeader("content-disposition", "filename=MyImage"); 
    Response.ContentType = "image/jpeg";   

    // Send output to client 
    memStream.WriteTo(Response.OutputStream); 
    memStream.Dispose(); 
    Response.Flush(); 
} 
+0

Đã hết thời gian trên máy chủ * vì tải nặng *? Là máy chủ tải ánh sáng? Bạn đã thử nghiệm điều này trên máy chủ cục bộ của bạn? –

+8

Ngoài ra, hãy bọc mọi thứ thực hiện 'IDisposable' trong khối' using'. Nếu một ngoại lệ được ném ra vì bất kỳ lý do gì trước khi bạn gọi '.Dispose()', bạn sẽ bị rò rỉ tài nguyên ... mà sẽ là xấu theo tải đặc biệt. –

+2

Nó không giải thích thời gian chờ, nhưng tôi sẽ sử dụng một HttpHandler đơn giản cho việc này thay vì sử dụng một thể hiện Trang, và trừ khi bạn đang làm một cái gì đó bất thường bạn có thể không cần cuộc gọi UnescapeDataString. – bmm6o

Trả lời

3

Có một số điều mà tôi sẽ thay đổi:

  • Surrond các dòng với sử dụng từ khóa using.
  • Sử dụng trình xử lý ashx thay thế. Có vẻ như bạn đang sử dụng tệp aspx. Đối với loại kịch bản này là tốt hơn để sử dụng một trình xử lý http, vì nó có vòng đời nhỏ hơn. Tôi đã sử dụng điều này rất nhiều lần để phục vụ hình thu nhỏ của hình ảnh.
  • Sử dụng một số bộ nhớ đệm. Có thể bạn có thể tận dụng các tính năng của bộ đệm asp.net, bạn có thể tìm hiểu xem có giá trị lặp lại cho t hay không, vì vậy bạn lưu trữ hình ảnh kết quả trên bộ nhớ cache và tránh việc viết và tạo một số hơi nước mỗi lần
  • Cuối cùng nhưng không kém phần quan trọng , hãy kiểm tra xem máy chủ có bản cập nhật và bản cập nhật mới nhất hay không. Có một số trường hợp ứng dụng sẽ hoạt động lạ nếu có một số bản cập nhật nhất định,

Ngoài ra, nó có thể được liên kết với trang trại. Bạn có thể xem lại các bộ đếm hiệu suất của máy chủ để xem xét nếu có một số báo cáo bất thường.

Hy vọng điều đó sẽ hữu ích.

1

Bạn có thể tiết kiệm một số bộ nhớ và có thể đạt được hiệu suất bằng cách tiết kiệm trực tiếp vào dòng đầu ra thay vì sử dụng một dòng bộ nhớ:

createdImage.Save(Response.OutputStream, ImageFormat.Jpeg); 

Một vấn đề khác có thể là mã của bạn là trong trang .aspx. Nó có thể được biên dịch lại thường xuyên. Tôi sẽ đề xuất một trình xử lý http:

public class MyHttpHandler : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     // prepare image like you did 
     memStream.WriteTo(context.Response.OutputStream); 
    } 

    // Override the IsReusable property. 
    public bool IsReusable 
    { 
     get { return true; } 
    } 
} 
Các vấn đề liên quan