【问题标题】:Implementing queue in c#在 C# 中实现队列
【发布时间】:2011-12-16 12:17:32
【问题描述】:

我正在开发一个 c# 应用程序,其中服务器一次从多个客户端获取请求。每个客户还从不同的数据库中获取数据。在这种情况下,有时会发生数据泄漏,这意味着客户端从错误的数据库中获取数据。例如,client1 应该从 db1 获取数据,client2 从 db2 获取数据。相反,他们从相反的数据库中获取数据; client1 从 db2 获取,client2 从 db1 获取。 我在下面添加了收集数据的代码。

public string List()
{ 
    Response.ContentType = ContentType.Xml;

    try
    {
        ThingzFilter filter = null;
        Dictionary<string, string> parameters = new Dictionary<string, string>();

        if (Id!="")
        {
            // get parameters from http request
            foreach (HttpInputItem param in Request.Param)
                parameters.Add(param.Name, param.Value);

            setServerURLs();
            //Request.Clear();

            if (Request.QueryString["lang"].Value != null)
            {
                ThingzDB.TzThing.get_language = Request.QueryString["lang"].Value.ToString();
            }
            else
            {
                ThingzDB.TzThing.get_language = SessionDatabase.DefaultLanguage;
            }
        }

        ThingzDatabase db = SessionDatabase;

        langStr = db.Language;

        // this is run if there was no ID supplied
        // which means we want all items of all types
        if (Id == "")
        {
            if (Request.AcceptTypes == null)
            {
                //TypeController.session_id = Request.QueryString["sessionid"].Value;

                jobs.Add(Request.QueryString["sessionid"].Value);
                if (nextJobPos > jobs.Count - 1)
                    return "";
                else
                {
                    TypeController.session_id = jobs[nextJobPos];
                    nextJobPos++;
                    langStr = SessionDatabase.Language;
                }

                filter = new AllThingzFilter(SessionDatabase, parameters, langStr);
                TypeController.session_id = "";
                filter.Execute();
            }

在此服务器中是控制台应用程序,客户端是站点名称的窗口,这意味着提及数据库名称。 请给我一个解决方案来解决这个问题。

【问题讨论】:

  • 很难找出你的问题。因为数据库相关的问题大多不仅仅是客户端的问题。
  • 实际上是会话 id 的问题,仅根据会话 id 获取数据。
  • 快速提示:检查空字符串时,例如使用您的if-statement:if (Id!="");你真的应该使用string.IsNullOrEmpty(...)string.IsNullOrWhitespace(...)
  • 这是多线程的吗?也许你有一个竞争条件。当您获得 client1 的 session_id 并尝试为他获取数据时,client2 加入并覆盖 session_id。
  • “SessionDatabase”存储在哪里?

标签: c#


【解决方案1】:

在不确切知道SessionDatabase 的作用域(从名称看来它似乎是一个会话变量)或者它的实现是否是执行某种复杂逻辑的属性的情况下,我猜你有两个问题:

  • 在多个客户端访问时将值存储在错误的范围内
  • 在您的代码中交替使用 dbSessionDatabase

对于后者,我建议将db = SessionDatabase 放在代码的顶部一次(确保SessionDatabase 对那个客户端来说是正确的,然后在该方法的其余部分使用db

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2011-09-07
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    相关资源
    最近更新 更多