ASP.Net WebForms, выполняющие несколько запросов одновременно - PullRequest
1 голос
/ 25 августа 2010

Это для корпоративного веб-приложения.

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

Мы создали запросы, которые возвращают данные, и все они требуют времени для выполнения (~ 7 секунд каждый). Так что, если мы позволим первой странице работать с одной панелью обновления, изображение будет вращаться в течение ~ 21 секунды и отображать все. Мы разбили этот код на 3 панели обновления и установили загрузку как условную. Когда мы делаем это, мы получаем одну коробку для загрузки каждые 7 секунд. Это шаг в правильном направлении, но они загружаются последовательно (запрашивается UC_NotStarted, ждет 7 секунд и отображает, затем UC_Active идет в течение 7 секунд и, наконец, UC_Finished работает в течение 7 секунд). Мы все еще на 21 секунде, но данные показываются каждые 7 секунд.

Мы бы хотели, чтобы все данные отображались за 7 секунд, поскольку все панели обновления должны извлекать данные одновременно. Вместо того чтобы использовать LinqToSQL для извлечения данных, я сейчас склоняюсь к веб-сервисам, чтобы получить их, но не уверен, сработает ли это.

1 Ответ

0 голосов
/ 25 августа 2010

Посмотрите на 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...