【问题标题】:Multi-threading for overload and thread name is empty多线程重载和线程名称为空
【发布时间】:2012-01-31 20:44:56
【问题描述】:

这种情况可能看起来很奇怪,但这是我必须做的:

情况,我有一个共享点门户,并且存在这样一个问题,即在检索用户个人资料时可能会出现问题,当很多人在线并执行此类操作时可能会太慢,因此做了一个决定制作一个控制台应用程序来测试它。

控制台应用程序需要模拟用于检索用户配置文件的行为,就像许多不同的用户正在这样做一样。

而且一定要写日志。

第一个问题是这种测试是真正了解问题所在的好方法吗?

另一个问题是关于我的应用程序,我有一个奇怪的行为:

public class Program
    {
        static void Main(string[] args)
        {
            string filePath = @"C:\Users\User\Desktop\logfile.txt";
            string siteUrl = @"http://siteurl";
            int threads = 1;

            //Multiplicator multiplicator = new Multiplicator(filePath, siteUrl, threads);
            //Console.ReadLine();
            for (int i = 0; i < 100; i++)
            {
                Thread t = new Thread(Execute);
                t.Start();
            }

            Console.WriteLine("Main thread: " + Thread.CurrentThread.Name);
            // Simultaneously, do something on the main thread.
          }

        static void Execute()
        {
            for (int i = 0; i < 100; i++)
            {
                using (SPSite ospSite = new SPSite(@"http://siteurl"))
                {
                    SPServiceContext serviceContext = SPServiceContext.GetContext(ospSite);
                    UserProfileManager profileManager = new UserProfileManager(serviceContext);
                    UserProfile userProfile = profileManager.GetUserProfile("User Name");
                    string message = "Retrieved: " + userProfile.DisplayName + " on " +DateTime.Now + "by " Thread.CurrentThread.Name;
                    Console.WriteLine(message);
                }
            }
        }
    }

所以问题是我从来没有写过线程的名称,为什么? Thread.CurrentThread.Name 为空,是否正常,可能是我初始化线程错误?尽管许多消息来源都说是这样完成的?

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    您还没有设置线程的名称。您应该在开始之前这样做,如果您愿意,可以在名称中包含迭代编号:

    Thread t = new Thread(Execute);
    t.Name = "My Thread" + i.ToString();
    t.Start();
    

    它们不会自动命名。名字只能设置一次,之后你会得到一个InvalidOperationException

    MSDN Reference: Thread.Name

    顺便说一句,在正常情况下创建 100 个线程可能不是一个好主意。

    【讨论】:

    • 另外,Thread.Name 没有必须在你启动线程之前设置。这在您的情况下才有意义,以确保在您尝试读取之前设置该值。
    【解决方案2】:

    你需要给它一个名字。就在你创建线程的时候,根据 i 命名即可

    Thread t = new Thread(Execute) { Name = i.ToString() };
    

    【讨论】:

      【解决方案3】:

      好的,我会回答你的第一个问题。不,有更好的方法来做到这一点。

      1. 使网站处于负载状态。也许朋友可以一直按 F5,或者你运行一个包含 1000 行 curl get 的批处理文件
      2. 将 Visual Studio 调试器附加到 Web 服务器进程
      3. 点击 break 10 次,看看它大部分时间停在哪里。那是您的热点/问题。

      这被称为穷人分析器。它内置于每个 Visual Studio 中;-)

      一般情况下,通过 profiling 很容易发现此类问题。甚至有复杂的工具可以做到这一点。

      【讨论】:

      • 您能否提供一个指向个人资料共享点门户的链接,以及如何找到共享点网站的薄弱环节?
      • 没有“链接”,因为没有关于此技术的更多信息。听起来很简单。您还想了解什么?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 2016-07-22
      • 1970-01-01
      相关资源
      最近更新 更多