Как запустить асинхронный процесс? - PullRequest
2 голосов
/ 17 июля 2009

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

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

Ответы [ 4 ]

1 голос
/ 17 июля 2009

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

Ознакомьтесь со следующим ответом на связанный вопрос.

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

Редактировать: 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 = "true" в вашей директиве 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"

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

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
1 голос
/ 17 июля 2009

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

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

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

0 голосов
/ 17 июля 2009

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

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

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

0 голосов
/ 17 июля 2009

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

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