【问题标题】:ThreadPool.QueueUserWorkItem - strange behaviour (Asp.Net)ThreadPool.QueueUserWorkItem - 奇怪的行为(Asp.Net)
【发布时间】:2011-01-13 03:23:18
【问题描述】:

我目前在 Asp.Net 应用程序中使用 ThreadPool.QueueUserWorkItem。 基本上,用户使用带有 FileUpload 控件的表单上传文件。 该文件可能需要相当长的时间来处理,这会导致用户超时,并且还会在上传处理过程中导致 UI 无法使用。 所以我想我会像这样调用我的导入方法:

ThreadPool.QueueUserWorkItem(this.NameOfMyImportMethod);

导入方法需要处理的数据在构造Import类的时候已经设置为类变量了(后面的代码我没有做导入工作!)。

这在大多数情况下都可以正常工作。然而,看似随机的导入方法不会被异步调用,浏览器等待响应并最终超时。

我确保在导入方法中捕获所有异常。

我不能一直重新创建它,但它似乎主要发生在我在实际提交之前使用导致一些回发的表单。

关于这里可能发生什么的任何想法?

感谢您的帮助!

【问题讨论】:

    标签: c# .net asp.net threadpool


    【解决方案1】:

    感谢您的回复 - 虽然我会(有点)自己回答这个问题。 我最终只是手动创建了一个新线程——它似乎已经解决了这个问题。 这不是一个很好的解决方案,我仍然不知道为什么会这样。

    【讨论】:

      【解决方案2】:

      【讨论】:

        【解决方案3】:

        这有点遥不可及(特别是如果您在开发环境中看到问题,这些线程不应该有很多竞争),但您可能会用完线程池线程和/或陷入僵局,等待它们可用。

        您可以通过在您的页面中插入类似以下内容来进行检查,也许就在代表排队之后:

        int workerThreads;
        int maxWorkerThreads;
        int completionPortThreads;
        int maxCompletionPortThreads;
        
        ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads);
        ThreadPool.GetMaxThreads(out maxWorkerThreads, out maxCompletionPortThreads);
        
        System.Diagnostics.Debug.WriteLine(string.Format("There are {0} of {1} worker threads available.\r\n", workerThreads, maxWorkerThreads));
        

        您是否在页面的其他地方使用ThreadPool

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-09
          • 2017-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多