/ / ASP.Net WebForms едновременно изпълнява многократни заявки - asp.net, ajax, web-услуги, updatepanel

ASP.Net WebForms изпълняват множество заявки едновременно - asp.net, ajax, web-services, updatepanel

Това е за корпоративно уеб приложение.

Ние изграждаме първа страница / табло за товапита нашата база данни за статистика на живо. Страницата има 3 панела за актуализация, всеки панел за актуализиране има потребителски контрол, който дърпа данни за полето й. Позволява извикване на потребителските контроли UC_NotStarted, UC_Active и UC_Finished.

Изградихме заявките, които връщат даннитеи всички те отнемат известно време да бягат (~ 7 секунди всяка). Така че, ако оставим първата страница да работи с един панел за актуализиране, изображението се върти за ~ 21 секунди и ще покаже всичко. Разбихме този код на 3 панела за актуализация и поставихме зареждането на условно. Когато правим това, получаваме една кутия за зареждане на всеки 7 секунди. Това е стъпка в правилната посока, но се зареждат последователно (UC_NotStarted се запитва, чака 7 секунди и се показва, след това UC_Active продължава 7 секунди и накрая UC_Finished работи 7 секунди). Все още сме на 21 секунди, но данните се показват на всеки 7 секунди.

Бихме искали всички данни да бъдат показани в 7секунди, тъй като всички панели за актуализиране трябва да получават данните едновременно. Вместо да използвам LinqToSQL, за да изтеглям данните, сега се навеждам към уеб услуги, за да го получавам, но не съм сигурен дали това ще работи.

Отговори:

0 за отговор № 1

Погледни към ThreadPool, по - специално QueueUserWorkItem метод. Напълно възможно е с това да стартирате 3 заявки едновременно и да седнете в Thread.Sleep цикъл, чакащ и трите да приключат изпълнението, така че можете да актуализирате всички подходящи части на страницата.

Следващият код почти сигурно изисква настройване, но ще ви даде груба представа как да направите това:

public class QueryResult
{
public bool Completed;
public DataTable Result;
public int ResultId;
}

public void GetData()
{
var QueryResults = new List<QueryResult>();
queryResults.Add(new QueryResult() { ResultId = 1 });
queryResults.Add(new QueryResult() { ResultId = 2 });
queryResults.Add(new QueryResult() { ResultId = 3 });

ThreadPool.QueueUserWorkItem(new WaitCallback(QueryRoutine), queryResults[0]);
ThreadPool.QueueUserWorkItem(new WaitCallback(QueryRoutine), queryResults[1]);
ThreadPool.QueueUserWorkItem(new WaitCallback(QueryRoutine), queryResults[2]);

var completedResults = new List<QueryResult>();
while(QueryResults.Count > 0)
{
for(int 1 = QueryResults.Count - 1; i >= 0; i--;)
{
if (queryResults[i].Completed)
{
completedResults.Add(queryResults[i]);
queryResults.RemoveAt(i);
}
}
Thread.Sleep(500);
}

// All background threads have completed, do something with the results,
// return them to the front-end, etc,..
}

public void QueryRoutine(object qR)
{
var queryResult = (QueryResult)qR;

// perform long running query here on a distinct thread, as QueryRoutine
// is now being run on three separate threads by the calls to QueueUserWorkItem
// based on queryResult.ResultId picking the relevant query for values
// of 1, 2 or 3

queryResult.Completed = true;
}