Проблема с потоками (и перенаправление) при поиске в списке с помощью queryString - PullRequest
0 голосов
/ 14 сентября 2011

РЕДАКТИРОВАТЬ: обновили код, осталась проблема в том, что мне нужно подождать, пока "поток" вышел с кодом 0 ", прежде чем я могу сделать новый поиск. Если я не запускаю события кнопки, но не page_Load. Есть ли способ справиться с этим?

Я создаю веб-страницу aspx (localhost) для подготовки к сертификации. Страница содержит представление grindview, которое представляет данные, окно поиска и кнопку для поиска на высшем уровне. Я использую Linq, чтобы получить результат из базы данных, строку запроса для хранения результатов поиска при обратной передаче и кэш для хранения результата без поиска. Страница загружается медленно в первый раз и быстро загружается после обновления (поэтому, вероятно, кеширование работает). Запрос Linq также дает ожидаемый результат, и URL-адрес сайта соответствует тому, что пользователь вводит в текстовое поле.

Public void Button_Search(object sender, EventArgs e)
    protected void Button1_Click(object sender, EventArgs e)
    {
        Debug.WriteLine("Button Pressed");
        String s = ("~/Matches.aspx");
        if (TextBox1.Text != null && TextBox1.Text != "")
        {
            s = (s + "?Search=" +TextBox1.Text);
        }
        Debug.WriteLine("Redirction adress:" +s);
        Response.Redirect(s, false);
        Context.ApplicationInstance.CompleteRequest();
    }

тогда моя функция page_Load

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
        {
            Debug.WriteLine("---------------");
            Debug.WriteLine("PageLoad");

            if (Request.QueryString["Search"] != null)
            {
                Debug.WriteLine("SerchValueFound");
                search = Request.QueryString["Search"];
            }
            if (Cache["MatchesCache"] == null)
            {
                Debug.WriteLine("Cache Loading");
                using (ConnectionToDBDataContext context = new ConnectionToDBDataContext())
                {
                    try
                    {

                        var lista = (from game in context.Games
                                     join home in context.Teams on game.HomeTeamID equals home.TeamID
                                     join away in context.Teams on game.AwayTeamID equals away.TeamID
                                     join arenaName in context.Arenas on game.ArenaID equals arenaName.ArenaID
                                     select new Match
                                     {
                                         MatchID = (int)game.MatchID,
                                         Date = (int)game.Date,
                                         TimeStart = game.TimeStart,
                                         HomeTeam = home.TeamName,
                                         AwayTeam = away.TeamName,
                                         HomeGoals = (int)game.HomeTeamGoals,
                                         AwayGoals = (int)game.AwayTeamGoals,
                                         Arena = arenaName.ArenaName,
                                         Line = "-"
                                     });
                        list = lista.ToList();
                        Cache.Insert("MatchesCache", list, null, DateTime.Now.AddDays(1), System.Web.Caching.Cache.NoSlidingExpiration);
                    }
                    catch { Debug.WriteLine("Failed to update cache"); }
                }
            }
            list = (List<Match>)Cache["MatchesCache"];
            Debug.WriteLine("List loaded from Cache");


            if (search != null && search != "")
            {
                Debug.WriteLine("Search is beeing done");
                List<Match> newList = new List<Match>();
                foreach (Match m in list)
                {
                    if (m.AwayTeam.Contains(search) || m.HomeTeam.Contains(search))
                    {
                        newList.Add(m);
                    }
                }
                list = newList;
            }
            GridView1.DataSource = list;
            GridView1.DataBind();
            search = "";
            Debug.WriteLine("---------------");
        }

1 Ответ

2 голосов
/ 14 сентября 2011

Вы пытались поместить туда некоторый отладочный код, чтобы проверить, извлекается ли список объектов Match из Cache vs DB, без использования точек останова?

---- Обновление ----

Я взял ваш код (кроме бита базы данных) и поместил его в сеть ASP.NET 4.0приложение, и все это, кажется, работает нормально ...

Вот страница aspx:

<%@ Page Title="Home Page" Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
    Inherits="WebApplication1._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head id="Head1" runat="server">
    <title></title>    
</head>
<body>
    <form id="Form1" runat="server">
        <div>
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
            <asp:GridView ID="GridView1" runat="server">
            </asp:GridView>
        </div>
    </form>
</body>
</html>

И вот код для него:

using System;
using System.Collections.Generic;
using System.Diagnostics;

namespace WebApplication1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                List<Match> list;
                string search = null;

                Debug.WriteLine("---------------");
                Debug.WriteLine("PageLoad");

                if (Request.QueryString["Search"] != null)
                {
                    Debug.WriteLine("SerchValueFound");
                    search = Request.QueryString["Search"];
                }

                if (Cache["MatchesCache"] == null)
                {
                    Debug.WriteLine("Cache Loading");

                    try
                    {
                        list = new List<Match>
                        {
                            new Match{MatchId = 1, Date = 1, TimeStart = 1, AwayTeam = "the flying fijians", HomeTeam = "wallabies"},
                            new Match{MatchId = 2, Date = 1, TimeStart = 1, AwayTeam = "wallabies", HomeTeam = "all blacks"},
                            new Match{MatchId = 3, Date = 1, TimeStart = 1, AwayTeam = "springboks", HomeTeam = "all blacks"},
                        };

                        Cache.Insert("MatchesCache", list, null, DateTime.Now.AddDays(1), System.Web.Caching.Cache.NoSlidingExpiration);
                    }
                    catch
                    {
                        Debug.WriteLine("Failed to update cache");
                    }                    
                }

                list = (List<Match>)Cache["MatchesCache"];
                Debug.WriteLine("List loaded from Cache");

                if (!string.IsNullOrEmpty(search))
                {
                    Debug.WriteLine("Search is beeing done");
                    var newList = new List<Match>();

                    foreach (var m in list)
                    {
                        if (m.AwayTeam.Contains(search) || m.HomeTeam.Contains(search))
                        {
                            newList.Add(m);
                        }
                    }
                    list = newList;
                }

                GridView1.DataSource = list;
                GridView1.DataBind();                               

                Debug.WriteLine("---------------");
            }            
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Debug.WriteLine("Button Pressed");
            var s = ("~/Default.aspx");

            if (!string.IsNullOrEmpty(TextBox1.Text))
            {
                s = (s + "?Search=" + TextBox1.Text);
            }

            Debug.WriteLine("Redirction adress:" + s);
            Response.Redirect(s, false);            
        }
    }

    public class Match
    {
        public int MatchId { get; set; }
        public int Date { get; set; }
        public int TimeStart { get; set; }
        public string HomeTeam { get; set; }
        public string AwayTeam { get; set; }                                         
    }
}

Возможно, это проблема вашего ConnectionToDBDataContext?

...