2009-07-16 2 views
2

У меня есть веб-форма, которую когда-то заполнял, нужно начинать длительный процесс. Поскольку я не хочу, чтобы пользователь сидел там, ожидая его завершения, я хочу запустить задачу, а затем перевести пользователя на другую страницу, чтобы продолжить работу.Как начать асинхронный процесс?

Выполнение этого предполагает использование асинхронного процесса, и если да, то у кого-нибудь есть пример того, как это сделать?

ответ

1

в принципе вам нужна противопожарная н забыть реализации где вы можете просто запустить асинхронную операцию, не дожидаясь ее завершения.

Отъезд следующие answer по соответствующему вопросу.

Код находится на C# .Net, но vb.net должен быть аналогичным.

Edit: Vb.net Решение:

Это vb.net решение уволить веб-метод асинхронно:

Рассмотрим веб-метод следующим образом:

Public Class Service1 
    Inherits System.Web.Services.WebService 

    <WebMethod()> _ 
    Public Sub LengthyProcess() 
     'Perform the lengthy operation 
     'Also note this doesn't return anything 
     'Hence can be used safely in fire-n-forget way of asynchronous delegate 
     System.Threading.Thread.Sleep(1000) 
     System.IO.File.WriteAllText("C:\\MyFile.txt", "This is the content to write!", Encoding.UTF8) 
     System.Threading.Thread.Sleep(1000) 
    End Sub 

End Class 

сейчас для асинхронного вызова веб-метода вы можете выполнить одно из следующих значений в зависимости от вашей версии .Net:

.Net 3.5 (Я не уверен, работает ли он в 2.0)

Убедитесь, что установлен Async = "истинный" в вашей директиве Page

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="WebApplication1._Default" Async="true" %> 

А в коде позади:

Partial Public Class _Default 
    Inherits System.Web.UI.Page 

    Dim webService As MyService.Service1 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    End Sub 

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click 
     webService = New MyService.Service1() 
     webService.LengthyProcessAsync() 
    End Sub 

End Class 

.Net 2,0/1,0

Нет необходимости устанавливать Async = "true"

И в коде-поведении d:

Partial Public Class _Default 
    Inherits System.Web.UI.Page 

    Public Delegate Sub MyDelegateCallBack() 
    Dim webService As MyService.Service1 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    End Sub 

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click 
     webService = New MyService.Service1() 
     Dim del As MyDelegateCallBack 
     del = New MyDelegateCallBack(AddressOf webService.LengthyProcess) 
     del.BeginInvoke(Nothing, Nothing) 
    End Sub 
End Class 
+0

Я определенно ищу решение по-за-забыть. Меня не волнует, какой результат вызванного веб-сервиса, так как я буду обрабатывать это в веб-сервисе. Прошу прощения, но я не мог следовать тому, что вы делаете в этом примере, на который вы ссылались. Если возможно, вы можете дать мне короткое объяснение? Благодарю. – kirpre

+0

Я добавил решение vb.net к моему ответу. Дайте мне знать, если вам нужно рассказать об этом. –

+0

Большое спасибо за вашу помощь. Я смог заставить это работать наконец. Единственное странное, что, хотя этот проект использует фреймворк 3.5, я мог бы получить только решение 1.0/2.0, которое вы представили для работы. Решение 3.5 не будет продолжаться до тех пор, пока веб-сервис не будет завершен. Еще раз спасибо. – kirpre

0

Ознакомьтесь с компонентом BackgroundWorker: BackgroundWorker Component. Образец здесь показывает, как использовать его для обновления пользовательского интерфейса в приложении VB, но универсальный принцип.

+0

Он работает в Интернете, и BackgroundWorker не применяется там хорошо, поскольку, когда запрос завершен, откуда работает отчет BackgroundWorker? Нить, обслуживающая исходный запрос, переместилась. Кроме того, BackgroundWorker использует поток ThreadPool (через BeginInvoke), что уменьшает масштабируемость веб-сайта, поскольку ASP.Net использует потоки ThreadPool для обслуживания запросов. – codekaizen

+0

Ах, пропустил это. Понимание чтения FTW. –

+0

Тег - это то, что меня бросило. Я повторил его для ASP.NET, так как он упомянул в теле, что это веб-форма с использованием VB.NET. –

1

Это зависит от процесса. Насколько надежным это должно быть? Это нормально, если процесс сработает? Нужно ли восстанавливаться после сбоя? После сбоя системы?

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

Услуга может быть настроена для запуска при запуске Windows и перезагрузки при ее сбое.

0

Я нашел самое быстрое и легкое решение для «тяжелых» фоновых процессов - это закодировать логику в приложении консоли и использовать планировщик окон для периодического запуска приложения или запуска его при необходимости.

Я нашел это намного лучше, чем кодирование службы Windows, так как требует гораздо меньше обработки ошибок (то есть, если служба умирает, ее нужно восстановить, а если консольное приложение умирает, просто отправьте уведомление об ошибке и дождитесь следующего запуска .

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