在线程中获取目录时的对象引用错误

时间:2012-09-29 08:35:00

标签: c# threadpool .net

嗨,我想尝试访问我的帖子中的文件夹,就像这样

protected string GetFolderName(int OrgID)
{
    string FolderName = string.Empty;
    string[] strDirectories = Directory.GetDirectories(HttpContext.Current.Server.MapPath("~/Uploads/"));
    if (strDirectories.Length > 0)
    {
        for (int count = 0; count < strDirectories.Length; count++)
        {
            string name = strDirectories[count].Substring(strDirectories[count].LastIndexOf("\\") + 1);
            if (name.Contains("_"))
            {
                string companyId = name.Substring(name.LastIndexOf("_") + 1);
                if (Convert.ToInt32(companyId) == OrgID)
                {
                    FolderName = name;
                    break;
                }
            }
        }
    }
    return FolderName;
}

这个方法是通过线程池调用的,它在这一行给我一个错误“对象引用未设置为对象的实例”

string[] strDirectories = Directory.GetDirectories(HttpContext.Current.Server.MapPath("~/Uploads/"));

请帮帮我


解决方案

我使用HttpRuntime.AppDomainAppPath代替HttpContext.Current.Server.MapPath而且效果很好。

2 个答案:

答案 0 :(得分:2)

HttpContext.Current返回正在执行的线程中的当前上下文 。线程池线程不对任何HTTP请求负责,因此它没有上下文。 Current属性将返回null,这就是您获得异常的原因。我建议您在转移到线程池之前调用Directory.GetDirectories() 。另一种方法是改为传递上下文。

编辑:如果你不想在线程池线程中执行Directory.GetDirectories(),你至少可以在原始线程中评估HttpContext.Current.Server.MapPath("~/Uploads/"),并使 可用到线程池。基本上你只是想避免在错误的线程上评估HttpContext.Current

答案 1 :(得分:1)

发送HttpContext.Current.Server.MapPath("~/Uploads/")作为QueueUserWorkItem

中的最后一个参数