Как запускать длинные задачи со страницы ASP.NET? - PullRequest
4 голосов
/ 18 февраля 2011

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

Мой вопрос: каков наилучший подход к обработке обработки на стороне сервера?файлы?Обработка включает в себя вызов exe.Должен ли я использовать отдельные темы для этого?

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

Я пробовал этот код, но мойзадача никогда не запускается на сервере:

Action<object> action = (object obj) =>
{
      // Create a .xdu file for this job
       string xduFile = launcher.CreateSingleJobBatchFile(LanguagePair, SourceFileLocation);

      // Launch the job                 
      launcher.ProcessJob(xduFile);
};

Task job = new Task(action, "test");
job.Start();

Любые предложения приветствуются.

Ответы [ 3 ]

6 голосов
/ 18 февраля 2011

Вы можете вызывать функции обработки асинхронно в классическом режиме и забыть способ:

В .NET 4.0 вы должны сделать это, используя новую Task Parallel Library :

Task.Factory.StartNew(() =>
{
    // Do work
});

Если вам нужно передать аргумент делегату действия, вы можете сделать это следующим образом:

Action<object> task = args =>
{
    // Do work with args
};    
Task.Factory.StartNew(task, "SomeArgument");

В .NET 3.5 и более ранних версиях вместо этого вы бы сделали это следующим образом:

ThreadPool.QueueUserWorkItem(args =>
{
   // Do work
});

Связанные ресурсы:

2 голосов
/ 18 февраля 2011

Использование:

ThreadPool.QueueUserWorkItem(o => MyFunc(arg0, arg1, ...));

Где MyFunc () выполняет серверную обработку в фоновом режиме после того, как пользователь отправляет страницу;

1 голос
/ 18 февраля 2011

У меня есть сайт, который делает потенциально долго работающие вещи, которые должны реагировать и обновлять таймер для пользователя.

Мое решение состояло в том, чтобы встроить конечный автомат в страницу со скрытым значением и некоторыми значениями сеанса.

У меня есть следующие элементы aspx:

<asp:Timer ID="Timer1" runat="server" Interval="1600" />
<asp:HiddenField runat="server" ID="hdnASynchStatus" Value="" />

Имой код выглядит примерно так:

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

Private Sub PostbackStateEngineStep()
    If hdnASynchStatus.Value = "" And Not CBool(Session("WaitingForCallback")) Then

        Dim i As IAsyncResult = {...run something that spawns in it's own thread, and calls ProcessCallBack when it's done...}

        Session.Add("WaitingForCallback", True)
        Session.Add("InvokeTime", DateTime.Now)
        hdnASynchStatus.Value = "WaitingForCallback"
    ElseIf CBool(Session("WaitingForCallback")) Then
        If Not CBool(Session("ProcessComplete")) Then
            hdnASynchStatus.Value = "WaitingForCallback"
        Else
            'ALL DONE HERE
            'redirect to the next page now
            response.redirect(...)
        End If
    Else
        hdnASynchStatus.Value = "DoProcessing"
    End If
End Sub
Public Sub ProcessCallBack(ByVal ar As IAsyncResult)
    Session.Add("ProcessComplete", True)
End Sub
Private Sub UpdateElapsedTime()
    'update a label with the elapsed time
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...