LINQ-SQL & ADO.NET - Как сделать массовую транзакцию полностью асинхронной? - PullRequest
0 голосов
/ 13 августа 2010

Итак, я имею дело с приложением ASP.NET 4.0 Web Forms, в котором DAL построен с использованием комбинации 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. Единственное, что мне нужно от вызова - это количество обновленных строк.

Есть идеи людей?

Ответы [ 3 ]

0 голосов
/ 13 августа 2010

Вы не можете делать такого рода вещи в ASP.NET!Объект страницы и все на нем пропали после завершения запроса!

См. Злой код: асинхронные страницы в ASP.NET 2.0 и вообще http://social.msdn.microsoft.com/Search/en-US/?Query=asynchronous+asp.net.

0 голосов
/ 18 апреля 2012

Асинхронно означает, что следующая обслуживаемая веб-страница не будет ждать завершения транзакции. Что делать, если вы просто вытаскиваете свой DAL из веб-приложения на собственный сервисный уровень.

Может быть, это то, что вы хотите Асинхронный обработчик ответа

0 голосов
/ 13 августа 2010

Решена проблема с увеличением тайм-аута для этой конкретной команды.

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

Но я открыт для некоторых лучших предложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...