我目前在Asp.Net应用程序中使用ThreadPool.QueueUserWorkItem。 基本上,用户使用带有FileUpload Control的表单上传文件。 该文件可能需要很长时间才能处理,这会导致用户超时,并且在上载处理过程中也会使UI无法使用。 所以我想我只需要调用我的导入方法:
ThreadPool.QueueUserWorkItem(this.NameOfMyImportMethod);
导入方法需要处理的数据在构造Import类时已经设置为类变量(我没有在后面的代码中进行导入工作!)。
这一切在大多数时候都很好。然而,看似随意的导入方法不会异步调用,浏览器等待响应并最终超时。
我确保我在导入方法中捕获所有异常。
我不能一直重新创建它,但似乎主要是因为我在实际提交之前使用该表单导致一些帖子后退。
关于这里可能会发生什么的任何想法?
感谢您的帮助!
答案 0 :(得分:1)
这有点过分(特别是如果您在开发环境中看到问题,这些线程不应该存在很多竞争),但是您可能已经没有线程池线程和/或者陷入僵局,等待它们变得可用。
您可以在页面中插入类似下面的内容进行检查,也许是在排队代表之后:
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
?
答案 1 :(得分:1)
我建议您使用Async Pages或Async Hanlder上传文件。
关于上传文件,请点击此处:http://weblogs.asp.net/jgalloway/archive/2008/01/08/large-file-uploads-in-asp-net.aspx
答案 2 :(得分:0)
感谢您的回复 - 虽然我会(有点)回答这个问题。 我最终只是手动创建一个新线程 - 似乎解决了问题。 这不是一个很好的解决方案,我仍然不知道为什么会这样。