我的asp.net页面中有一个代码,我在数据库中插入一些数据,同时将文件上传到服务器。问题是,似乎应用程序在将文件插入数据库之前等待上载文件。下面是一个类似于我的代码。
public partial class _Default : System.Web.UI.Page
{
protected HtmlInputFile XLSFileInput;
...
protected void ImportButton_Click(object sender, EventArgs e)
{
InsertToDatabase(); //method to insert to database
XLSFileInput.PostedFile.SaveAs(filePath + fileName);
}
...
}
这里的问题是,只有在将文件上传到服务器后,才会执行InsertToDatabase()方法。任何帮助表示赞赏。
答案 0 :(得分:2)
我不建议尝试在ASP.NET中手动控制线程,这是一个纯粹留给IIS的工作。
IMO for ASP.NET处理此问题的更好方法是通过浏览器中的多个AJAX操作调用这些请求,或者设置支持单向操作的WCF服务,因此当您调用“InsertToDatabase”时,它会执行一次火灾,忘记对位于您的数据库上的WCF服务的操作,该服务立即执行,然后继续到下一行代码。然后,IIS正在运行服务方法在其自己的线程中调用的代码。
使用WCF的IMO是在ASP.NET中处理线程的最合适的方法之一。因为您可以轻松地将任何服务方法设置为同步或异步。
修改强>
Introduction to Building Windows Communication Foundation Services
What You Need To Know About One-Way Calls, Callbacks, And Events
答案 1 :(得分:2)
这与IIS(网络服务器)线程没有任何关系,它更像是一个HTTP“问题”。
在客户端上选择文件,然后在运行任何服务器代码之前将所有响应数据(包括文件)发布到服务器。
因此文件已上传但未在InsertToDatabase()之前保存;被执行。
这种行为只能用几个帖子来解决(例如用ajax)并且可能不适合你。
告诉我们更多关于你想要完成的事情,我们可能会提出一些更好的建议:)。
答案 2 :(得分:1)
这通常是单线程应用程序的工作方式。
从你的代码我猜你使用ASP.NET Web Forms。
您必须考虑关闭InsertToDatabase()操作以释放程序以执行文件上载。也许根据您的版本考虑UpdatePanels是一种快速而肮脏的方法来实现这一目标吗?
您建议将这些操作分开,提供更多详细信息,以帮助确定每项任务的作用以及JavaScript是否可行。
但您的代码示例表明InsertToDatabase()应该在文件保存之前进行。
如果您不确定AJAX / JavaScript,可以使用线程池来执行InsertToDatabase()方法。然而,这完全取决于该方法的作用。请提供更多代码/详细信息。我个人将此用于后台发生的数据库插入(ASP.NET MVC中的日志记录操作过滤器,因此其他用户可能不同意此用法的有效性。但是它可能会节省您学习另一种语言。
ThreadPool.QueueUserWorkItem(delegate
{
// Code here
}
);
答案 3 :(得分:1)
文件上传是HTML表单帖子的一部分。由于上传是表单发布过程的一部分,因此它始终会在任何服务器端代码执行之前发生。 PostedFile.SaveAs()
调用不会导致上传,只会保存已作为请求的一部分上传的内容。
如果你绝对需要在上传开始之前插入数据库,你可以按 @Chris Marisic 建议并在提交表单之前将插件作为AJAX调用运行。
答案 4 :(得分:0)
您可以为数据库插入启动另一个线程。例如:
ThreadStart job = new ThreadStart(InsertToDatabase);
Thread thread = new Thread(job);
thread.Start();