2011-01-25 19 views
2

OK這裏的情況是:在ASP.NET頁面異步C#方法調用,但不工作的活動網站

我與我們的銷售人員的客戶統計數據表中的Web應用程序,每一行圖表顯示了過去12個月銷售數據的總體趨勢。每個頁面顯示一個特定的推銷員的客戶列表,其中一些可能有大量的客戶=巨大的行數=大量的迷你圖(例如特別是125個,需要15秒加載)。

由於這個原因,jQuery sparklines無法使用 - 它們完全鎖定了訪問頁面的用戶的CPU,並帶有大量的帶有IE的sparklines。

因此,我開始使用Google Chart API,它工作得非常好,除了兩個問題:1)它位於安全的站點上,並且Google Chart API URL僅通過HTTP提供(通過使用小包裝腳本解決動態下載圖形並從我們的安全服務器重新提供);和2)在125個迷惑的頁面上,由於請求的數量(即使使用0-9服務器前綴來最大化可用連接的數量),它仍然非常緩慢。

所以我的下一步是嘗試使每個「下載/抓取/重新提供圖像」方法調用異步 - 它的工作!

...但只在我的開發盒運行在調試模式。

當我將它推到實況網站時,速度更快,但它留下了一些圖像卸載,這當然是不可接受的。

所以這是我希望一些SO能手都知道:

1)爲什麼我的異步方法調用工作時的調試,但不活網站上的工作?

2)有沒有更簡單的方法讓大量的sparklines在安全的服務器上快速加載而不會讓我想撕掉頭髮?

2a。)有沒有人有使用ASP.NET圖表庫的經驗?這是我應該調查的嗎?

2b。)一位同事建議我使用1x1 CSS背景圖像製作自己的Sparkline例程並改變高度。問題是a)如果我們想進行更改,它是完全不可擴展的; b)看起來好像很糟糕(在標記中每個sparkline留下的bajillion DIV);和c)我不知道當一頁上有100-200個時它是否足夠快 - 您對1x1精靈方法的可行性有何看法?

在此先感謝。

+0

您應該開始研究爲什麼您的圖片未加載。在服務器上或JavaScript中引發的任何異常?像Firebug for Firefox這樣的工具可以在這種情況下變得非常方便,以便跟蹤所有請求和服務器響應。 –

回答

1

ASP.Net圖表以我的經驗很好。在http://betterdashboards.wordpress.com/2010/02/21/how-to-create-a-sparkline-chart-in-asp-net/有一個快速入門,讓你開始使用必要的配置來渲染一個迷你圖。

編輯:增加了在MVC中使用ASP.Net圖表的示例。顯然你想把這些代碼移到某種類的幫助類中,但是希望這可以清楚地說明做這件事情會發生什麼。

@model IEnumerable<CustomerSales>   
@using Chart = System.Web.UI.DataVisualization.Charting.Chart 
@{  
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table> 
    <tr> 
     <th> 
      Name 
     </th> 
     <th> 
      Sales 
     </th> 
    </tr> 

@foreach (var item in Model) 
{ 
    <tr> 
     <td> 
      @item.Name 
     </td> 
     <td> 
      @{ 

    var chart = new Chart(); 
    chart.ChartAreas.Add(new ChartArea()); 
    chart.ChartAreas[0].AxisX.LabelStyle.Enabled = false; 
    chart.ChartAreas[0].AxisY.LabelStyle.Enabled = false; 
    chart.ChartAreas[0].AxisX.MajorGrid.Enabled = false; 
    chart.ChartAreas[0].AxisY.MajorGrid.Enabled = false; 
    chart.ChartAreas[0].AxisX.MajorTickMark.Enabled = false; 
    chart.ChartAreas[0].AxisY.MajorTickMark.Enabled = false; 
    chart.ChartAreas[0].AxisX.LineWidth = 0; 
    chart.ChartAreas[0].AxisY.LineWidth = 0; 

    chart.Series.Add(new Series()); 
     // Assign the random number to the chart to create 35 points 
    for (int x = 0; x < item.Sales.Length; x++) 
    { 
     chart.Series[0].Points.AddXY(x, item.Sales[x]); 
    } 

    // Start hiding both sets of axes, labels, gridlines and tick marks 
    chart.ChartAreas[0].AxisX.LabelStyle.Enabled = false; 
    chart.ChartAreas[0].AxisY.LabelStyle.Enabled = false; 
    chart.ChartAreas[0].AxisX.MajorGrid.Enabled = false; 
    chart.ChartAreas[0].AxisY.MajorGrid.Enabled = false; 
    chart.ChartAreas[0].AxisX.MajorTickMark.Enabled = false; 
    chart.ChartAreas[0].AxisY.MajorTickMark.Enabled = false; 
    chart.ChartAreas[0].AxisX.LineWidth = 0; 
    chart.ChartAreas[0].AxisY.LineWidth = 0; 

    // Sparklines use the 'Spline' chart type to show a smoother trend with a line chart 
    chart.Series[0].ChartType = SeriesChartType.Spline; 

    // Since the line is the only thing you see on the chart, you might want to 
    // increase its width.&nbsp; Interestingly, you need to set the BorderWidth property 
    // in order to accomplish that. 
    chart.Series[0].BorderWidth = 2; 

    // Re-adjust the size of the chart to reduce unnecessary white space 
    chart.Width = 400; 
    chart.Height = 100; 
    string base64; 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     chart.SaveImage(ms); 
     var bytes = ms.GetBuffer(); 
     base64 = Convert.ToBase64String(bytes); 
    } 
/** 
    * Here's a simpler example that would do a regular chart, 
    * rather than a sparkline. No way to make the gridlines and axes go 
    * away with this helper that I'm aware of. 

    var chart = new Chart(
     width: 300, 
     height: 100 
     ) 
     .AddSeries(chartType: "Spline", yValues: item.Sales); 
    var bytes = chart.GetBytes(); 
    var base64 = Convert.ToBase64String(bytes);  
      */ 
       } 
      <img src="data:image/jpeg;base64,@base64" /> 
     </td> 
    </tr> 
} 

</table> 

這是使用一個模型,看起來像:

所有異步的
public class CustomerSales 
{ 
    public CustomerSales(string name, params int[] sales) 
    { 
     Name = name; 
     Sales = sales; 
    } 
    [Required] 
    public string Name { get; set; } 
    [Required] 
    public int[] Sales { get; set; } 
} 
+0

圖表控件確實獨立運行,但問題是1)我使用ASP.Net MVC,和2)我正在繪製一張桌子動態的,所以我不知道如何(或者如果有辦法)在視圖中的循環中動態生成服務器端控件,我可以堅持這些圖表。 (我見過的MVC圖表示例使用一個硬編碼面板來粘貼圖表,但事先並不知道需要多少面板) - 有什麼想法? – Whisker

+1

抱歉,延遲 - 您可以使用MVC中的圖表庫。這是一個帶有這個想法的剃刀視圖的草圖。如果你喜歡,我可以向你發送示例應用程序的zip文件。'@model IEnumerable的

@foreach(在模型VAR項) { ​​ @ item.Name ​​ @ { var chart = new Chart(); //等 – Xoltar

+1

好的,再次嘗試:我沒有在評論中留出空間來給出完整的示例,但是您可以只做一個新的Chart()並設置鏈接文章中的所有屬性。然後,您可以從圖表控件中獲取圖像,並寫入文件系統,然後將img標籤寫入頁面,也可以使用實際包含圖像的數據URI編寫img標籤。字符串base64;使用(var ms = new MemoryStream()) chart.SaveImage(ms); var bytes = ms.GetBuffer(); base64 = Convert.ToBase64String(bytes); } Xoltar

2

首先並不意味着更快的速度,你的情況下,將沒有什麼區別,如果沒有慢下來,甚至更多。

我只是想簡化發生了什麼,所以我可以更好地理解它。有一個頁面可以加載125-200張圖片。這些圖像是動態生成的圖形。這是總結髮生了什麼?如果是這樣的話:

如果客戶端有足夠的帶寬並且您的服務器可以處理請求並且您的服務器上有足夠大的管道,那麼加載這些許多映像應該不成問題。那麼延遲在哪裏?它是Google嗎?或者你的服務器放慢了速度?

與從瀏覽器直接轉到Google相比,速度要慢多少? 從瀏覽器直接訪問Google的響應時間是否可以接受? 如果不是,您可能需要在您的用戶界面中使用不同的策略,以便所有圖像都不會自動加載。或者每個客戶都在一個標籤頁中或將頁面分成多個頁面,因此一次只能請求少量數據並因此請求圖像。

您使用的Http套接字將被限制爲在任何時候向Google發出2個請求,無論您產生多大的線程。有一種方法可以改變這個數字(但我記不起我的頭頂如何)。無論如何,這很可能是你放緩的原因。

從業務層代碼中使用異步調用(在這種情況下執行一些I/O綁定操作)不會讓您獲得釋放請求線程以處理其他請求的好處。爲了這個工作,你需要使用異步頁面,因爲頁面可以通知IIS這個事實。任何其他的異步工作只是使用更多的線程(除非你使用的是異步CTP - C#5.0中使用的技術,並且特別使用I/O線程而不是工作線程)

現在給出你所看到的,在從Google獲取圖片時服務器端出現錯誤,您需要知道這些錯誤是什麼,我建議您不要使用async。

相關問題
名稱 銷售