2015-01-14 5 views
1

У меня есть два метода, нагрузки и разгрузки, которые заключаются в следующем:асинхронный выполнение задачи asp.net

protected Task load() 
{ 
    return Task.Run(() => 
    { 
     controls.AsParallel().Where(control => control is Button).Cast<Button>().ForAll(control => 
     { 
      control.Enabled = false; 
     }); 
    }); 
} 

protected Task unload() 
{ 
    return Task.Run(() => 
    { 
     controls.AsParallel().Where(control => control is Button).Cast<Button>().ForAll(control => 
     { 
      control.Enabled = true; 
     }); 
    }); 
} 

эффективно, они будут препятствовать пользователю моего веб-сайта от отправки нескольких запросов. То, что я пытаюсь сделать, это в основном: заблокировать все элементы управления кнопками, запустить функцию, соответствующую нажатой кнопке, а затем разблокировать все элементы управления кнопками. то есть:

protected async void doStuff(object sender, EventArgs e) 
{ 
    await load(); 
    await dostuffAsync(); 
    await unload(); 
} 

Я не подвожу никаких ошибок, но он просто не обновляется все до страницы, поэтому элементы управления никогда не отключается. Это можно сделать на asp.net? Я также попробовал scriptmanager безрезультатно: он снова просто выполняет все задачи одновременно, а затем обновляет страницу.

ответ

1

Здесь многое происходит, поэтому я постараюсь разбить его.

Прежде всего, это не должно работать. Если вам удастся заставить его работать, вы найдете свой код на неопределенной территории поведения, и это последнее место, которое вы хотите с точки зрения обслуживания.

Во-вторых, асинхронное поведение в веб-приложениях может вызывать все виды нежелательного поведения и не должно использоваться легко. Отключить кнопки не является хорошей причиной для добавления этого уровня сложности в ваше приложение.

В-третьих, если вы хотите, чтобы пользователи не отправляли формы во время обработки, вы должны всегда использовать какое-то поведение на стороне клиента. jQuery может сделать эти операции довольно тривиальными.

В-четвертых, если вам необходимо предотвратить выполнение пользователем нескольких операций на сервере в качестве меры безопасности или целостности, вы должны ограничить доступ к ресурсу , а не методу, который запускает операцию.

В-пятых, если это вообще возможно, вы должны прекратить активное развитие в ASP.Net Forms. Это не означает, что вам нужно переписать все существующее приложение, так как можно запускать ASP.Net Forms и MVC бок о бок. См. Здесь: http://www.hanselman.com/blog/IntegratingASPNETMVC3IntoExistingUpgradedASPNET4WebFormsApplications.aspx Ссылка говорит ASP.Net MVC 3, но я считаю, что это все еще применимо к последней версии MVC.

+0

Как вы узнали, что я использовал Формы? –

+0

MVC не использует элементы управления на стороне сервера, такие как Button. –

1

То, что вы пытаетесь сделать, не может быть выполнено с помощью async и await. async дает управление пулу потоков, а не клиенту.

Ваш лучший подход заключается в том, чтобы JavaScript отключил кнопки во время выполнения запроса и снова включил их при завершении.

P.S. Избегайте Task.Run и AsParallel на ASP.NET; они убивают масштабируемость.

+0

масштабируемость как в? –

+0

@NykolaiPeterson: как в способности обрабатывать большее количество запросов на одном и том же оборудовании. –

Смежные вопросы