2011-01-25 3 views
2

확인을 라이브 사이트에서 작동하지 않는 것은 상황 지난 12 개월 간 판매 데이터의 일반적인 추세를 보여주는 스파크 라인 그래프가 있습니다. 각 페이지에는 특정 세일즈맨의 고객 목록이 표시되며 막대한 수의 행 = 엄청난 수의 스파크 라인 (예 : 특히 125 개는로드하는 데 15 초 걸림)이있는 고객이 많습니다.비동기 C# 메서드 호출 디버그 작업을하지만, 여기에

이러한 이유 때문에 jQuery sparklines을 사용할 수 없습니다. IE에서 스파크 라인이 많은 페이지에 액세스하는 사용자의 CPU를 완전히 고정 시켰습니다.

두 가지 문제를 제외하고는 훨씬 더 나은 Google Chart API을 사용했습니다 : 1) 보안 사이트에 있고 Google Chart API URL은 HTTP를 통해서만 제공됩니다 (작은 래퍼 스크립트를 사용하여 해결됨). 그래프를 동적으로 다운로드하고 보안 서버에서 다시 제공). 2) 125 개의 스파크 라인이있는 페이지에서는 요청 수가 많아서 사용 가능한 연결 수를 최대화하기 위해 0-9 서버 접두어를 사용하는 경우에도 여전히 매우 느립니다.

그래서 내 다음 단계는 비동기 적으로 "다운로드/잡아/재사용 이미지"메서드 호출을 시도하는 것입니다.

... 디버그 모드로 실행중인 내 dev 상자에서만.

라이브 사이트로 밀어 넣을 때 더 빠르지 만 언로드 된 일부 이미지는 물론 허용되지 않습니다. 그래서 여기

내가 일부 SO 유능한 알고 있었으면 좋겠습니다 것입니다 :

1) 디버깅하지만 라이브 사이트에서 작동하지 않는 동안 왜 비동기 방식이 작동 호출된다?

2) 많은 수의 스파크 라인을 보안 서버에 빠르게로드하여 머리카락을 찢어 내고 싶지 않은 쉬운 방법이 있습니까?

2a.) 누구든지 ASP.NET 차트 라이브러리를 사용해 본 경험이 있습니까? 내가 조사해야 할 것이 있나요?

2b.) 공동 작업자는 1x1 CSS 배경 이미지를 사용하고 높이를 변경하여 내 스파크 라인 루틴을 만들 것을 제안했습니다. 문제는 a) 우리가 변경하기를 원한다면 완전히 확장 할 수 없다. b) 그것은 악의로 보인다 (마크 업에서 sparkline 당 bajillion DIV에 관해서 떠난다.); c) 한 페이지에 100-200 개가있을 때 충분히 빠르지는 모르겠다. 1x1 스프라이트 접근 방식의 실현 가능성에 대한 귀하의 생각은 무엇입니까?

미리 감사드립니다.

+0

이미지가로드되지 않는 이유를 조사해야합니다. 서버 또는 자바 스크립트에서 던져진 예외 Firefox 용 Firebug와 같은 도구는 이와 같은 상황에서 모든 요청과 서버가 응답하는 것을 추적하는 데 매우 유용 할 수 있습니다. –

답변

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 내에서 차트 라이브러리를 확실히 활용할 수 있습니다. 다음은 아이디어가있는 면도기 뷰의 스케치입니다. 원하는 경우 샘플 앱을 우편으로 보낼 수 있습니다.'@model를 IEnumerable

@foreach (모델에서 VAR 항목) {
이름 판매
item.Name @ @ { var chart = new Chart(); // etc – Xoltar

+1

다시 시도해주세요. 전체 예제를 제공하기 위해 주석에 공백이 없지만 새로운 Chart()를 수행하고 링크 된 기사 에서처럼 모든 속성을 설정할 수 있습니다. 그런 다음 차트 컨트롤에서 이미지를 가져 와서 파일 시스템에 쓰고 페이지에 img 태그를 쓰거나 실제로 이미지가 포함 된 데이터 URI가있는 img 태그를 작성할 수 있습니다. 문자열 base64; using (var ms = new MemoryStream()) { chart.SaveImage (ms); var bytes = ms.GetBuffer(); base64 = Convert.ToBase64String (bytes); } Xoltar

2

우선 빠른 것을 의미하지 않는다 및 귀하의 경우는 경우 느린없는 일 다운 더도 마찬가지입니다.

나는 더 잘 이해할 수 있도록 진행중인 작업을 간소화 할 것입니다. 125-200 이미지를로드하는 페이지가 있습니다. 이 이미지는 동적으로 생성 된 그래프입니다. 무슨 일이 일어나고 있는지 요약 해 줍니까? 그렇다면 :

클라이언트가 충분한 대역폭을 가지고 있고 서버가 요청을 처리 할 수 ​​있고 서버에 파이프가 충분히 큰 경우 많은 이미지를로드해도 문제가되지 않습니다. 그럼 지연은 어디 있습니까? Google입니까? 아니면 서버 속도가 느려 집니까?

브라우저에서 Google로 직접 이동하는 것과 비교하면 얼마나 느립니다? 브라우저에서 Google로 바로 연결될 수있는 응답 시간이 있습니까? 어쩌면 모든 이미지가 자동으로로드되지 않도록 UI에서 다른 전략을 사용해야 할 수도 있습니다. 또는 각 고객이 탭에 있거나 페이지로 나누어 져 있으므로 한 번에 소량의 데이터만으로 이미지가 요청됩니다.

사용중인 Http 소켓은 당신이 스폰하는 mant 스레드와 관계없이 언제든지 Google에 2 개의 요청을 보내는 것으로 제한됩니다. 이 숫자를 바꿀 수있는 방법이 있습니다 (하지만 머리 꼭대기에서 나는 기억할 수 없습니다). 어쨌든, 이것은 당신의 감속의 원인 일 가능성이 큽니다.

비즈니스 계층 코드에서 비동기 호출 (이 경우처럼 일부 I/O 바운드 작업을 수행하기 위해)을 사용하면 요청 스레드가 다른 요청을 처리 할 수있는 이점을 얻을 수 없습니다. 이 기능을 사용하려면 페이지에 IIS에이 사실을 알릴 수 있으므로 비동기 페이지를 사용해야합니다. 다른 비동기 작업은 비동기 CTP - C# 5.0에서 사용되는 기술과 I/O 스레드 및 작업자 스레드를 사용하지 않는 한 더 많은 스레드를 사용합니다.

Google에서 이미지를 가져올 때 서버 측의 오류이며 이러한 오류가 무엇인지 알아야합니다.이 경우 비동기를 사용하지 않는 것이 좋습니다.