2010-08-13 38 views
0

因此,我正在处理一个ASP.NET 4.0 Web窗体应用程序,其中DAL使用LINQ-SQL和经典ADO.NET(用于审计事务和批量更新)的组合构建。LINQ-SQL&ADO.NET - 如何使批量事务完全异步?

我有一个管理页面上的一堆记录(可能是成千上万)执行更新,更不用说在这些记录上有T-SQL触发器。不用说,它是一个更新的杀手。

所以,当然,页面超时。

更新事务与下面的代码执行:

db.ExecuteCommand("UPDATE [tblFoo] SET [IsFoo] = 0 WHERE [Bar] = {0}", bar.Id); 

所以这是一个经典的ADO.NET批量更新。

我一直试图做的是使调用此方法异步,通过发射了一个线程在窗体上的按钮点击:

protected void MyButton_Click(object sender, EventArgs eventArgs) 
{ 
    var thread = new Thread(OnMyAsyncMethod) { Name = "Hi, im a thread, how are you?"}; 
    var dataArray = new object[2]; 
    dataArray[0] = someData; 
    dataArray[1] = someData2; 
    thread.Start(dataArray); 
} 

的方法OnMyAsyncMethod只是执行上面的ADO .NET调用。

这解决了用户界面问题,现在该页面立即回发并刷新。但是,大约30秒后,我在Visual Studio工具栏上看到了这个美妙的闪光灯 - “发生了未处理的异常,您是否想要附加到进程等等。”

所以当然,现在在DAL中的实际呼叫超时。

我在做这个错误 - 有没有办法我可以执行更新事务(db.ExecuteCommand)完全异步?

希望你看到即时消息试图做什么 - 我只需要消灭一个T-SQL事务的杀手。我唯一需要回来的是更新的行数。

任何想法的人?

回答

0

通过增加该特定命令的超时来解决问题。

db.CommandTimeout = 300; // set timeout to 5 minutes 

但我打开一些更好的建议。

0

你不能在这种事情在ASP.NET!页面对象和其上的所有东西都是在请求完成后不见了

请参阅Wicked Code: Asynchronous Pages in ASP.NET 2.0,一般来说http://social.msdn.microsoft.com/Search/en-US/?Query=asynchronous+asp.net

+2

我知道 - 但即时通讯在我的异步方法不访问任何页面上。所有即时消息都是在点击按钮上 - 用params异步调用一个方法。该方法不需要页面,对象引用,什么也不需要 - 它是执行数据库更新的静态方法。无论如何,这个问题可以通过增加超时来解决(如下所示)。没有冒犯,但我不认为你阅读了整个问题。 – RPM1984 2010-08-13 04:08:29

0

通过异步方式,您的意思是提供的下一个网页不会等待事务完成。如果您只是将DAL从您的Web应用程序中拉出并放入其自己的服务层中,该怎么办?

也许这是你想要的 Asynchronous Response Handler