Não é capaz de atualizar a INTERFACE do usuário após a tarefa de plano de fundo de conclusão na minha ASP.NET aplicação

0

Pergunta

Estou executando uma longa funcionar como tarefa de plano de fundo no meu asp.net aplicação. Antes que a tarefa é concluída a thread principal sai (eu quero desse jeito só, já que se eu usar o aguardam palavra-chave e fazer a thread principal aguarde até que a tarefa em segundo plano é concluído, eu fico com mensagem de erro de proxy

Erro De Proxy
O proxy de servidor recebeu uma resposta inválida do servidor montante desde a tarefa de plano de fundo é muito longo

Mas uma vez que após a conclusão da tarefa, nem eu sou capaz de atualizar a página redirecionando para a mesma página ou nem eu sou capaz de substituir a INTERFACE do usuário. Existe alguma forma de INTERFACE de atualização após a thread principal conclusão da execução.

Meu código é este:

protected void btnImport_Click(object sender, EventArgs e)
{
        var task = ImportThread();

        if (task.IsCompleted)
        {
            DisplaySuccess("Import success");
        }
        else
            DisplayError("Import failed");
}

private async Task<bool> ImportThread()
{
        try
        {
            var success = await Task<bool>.Run(() => new Manager().Import().ConfigureAwait(false);

            if (task.IsCompleted)
            {
                DisplaySuccess("Import success");
            }
            else 
            {
                DisplayError("Import failed");
            }
    
            return true;
}

Acima assíncrono tarefa aguarda o método abaixo que está presente em outra classe.

public bool Import()
{
    // some operations here
    return true;
}

Após este método for concluído o controle de retorno de costas para ImportThread() mas o código escrito não para substituir a INTERFACE do usuário não atualizar a INTERFACE do usuário. Eu preciso update de INTERFACE do usuário com o estado de importação. E também a partir de ImportThread o controle não está indo de volta para o evento de clique de botão método também.

Por favor, ajude-me com a maneira como fazer o update de INTERFACE do usuário o status de importação.

Nota: eu tentei usar Redirect.Response no ImportThread() para atualizar a página, mas não funcionou

asp.net async-await background-task c#
2021-11-23 19:55:22
2

Melhor resposta

1

O seu problema é que você tem de captar e entender a página da web do ciclo de vida aqui.

Você tem este caso em que a página da web está sentado sobre os usuários da área de trabalho:

enter image description here

Agora dizer que o usuário clica em um botão.

Agora você tem isso:

 var task = ImportThread();

    if (task.IsCompleted)

Ok, assim que a página web no servidor. Você pode colocar no mesmo assíncrono espera até as vacas voltarem para casa, mas você AINDA TEM ESTA:

enter image description here

Assim, desde que o seu código é executado, ou de espera, a página da web AINDA está PRESO no lado do servidor. SOMENTE até que o código for concluído e sai a página de viagens para baixo, para o lado do cliente.

NOVAMENTE: O código por trás não pode parar, e não pode esperar por alguma coisa até o final, pois se não, em seguida, a página PERMANECE no servidor até que o processamento concluído.

ENTÃO, E SÓ ENTÃO a página da web para fazer a viagem de volta para baixo para o lado do cliente. Este, em seguida, ocorre;

enter image description here

E, em seguida, o SERVIDOR da PÁGINA do LADO É ATIRADAS para FORA da memória, e todas as variáveis de classe são DESTRUÍDOS!!! O servidor web está agora à espera de QUALQUER USUÁRIO para lançar uma página para o processamento!!

Então, se você precisa para executar algum tipo de processo de execução demorada?

Você tem algumas opções:

post a página code-behind é executado, o código por trás de iniciar um NOVO thread, página da web faz uma viagem de volta para o lado do cliente. Nesse ponto, você precisa de um temporizador + algum tipo de chamada de método (ajax) para consultar ou solicitar que o servidor se o longo processo em execução é feito. E uma vez que uma chamada ajax NÃO tem uso de qualquer web controles na página, ou página de variáveis de classe (lembre-se, DEPOIS que a página da web de viagens para baixo de volta para o lado do cliente, a página web NÃO é NÃO EXISTENTE web do lado do servidor na memória, nem é QUALQUER uma das variáveis de classe existente). Então, novamente, isto muito significa algum tipo de temporizador, ou como observado, um temporizador + código para ligar para ajax método. e que longo processo de execução terá que, MUITO provavelmente, o uso de sessões (), pois não é preciso o uso de controles ou mesmo ViewState.

E não é necessário usar uma chamada ajax. Você poderia usar um simples JavaScript do lado do cliente de rotina com um temporizador que dizer clica em um botão a cada 1 ou 2 segundos, o código é executado, e ele teria de obter o status de que o longo processo de execução (novamente, provavelmente, a partir de sessão) e, em seguida, atualizar a exibição. E, em seguida, você também pode incluir o código para parar o temporizador quando o status alterado para "done" ou qualquer outra coisa.

Por isso o código por trás não e não "atualização", a página web várias vezes. Você tem UMA viagem de volta, e o código por trás deve correr rápido, deve terminar a execução, e não pode mesmo usar um ESPERAM de comando, desde então, a página será STLL esperar, e AINDA ser preso no servidor.

Se você quer ir além da simples temporizador truque abordagem - que muitas vezes eu uso?

Em seguida, você precisa adotar e introduzir em seu site algo concebido para este tipo de caso -

Felizmente, não é o signalR para essa finalidade, e que, sem dúvida, a melhor opção e abordagem para você, pois é exatamente a sua pergunta e cenário.

SignalR

https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/introduction-to-signalr#:~:text=What%20is%20SignalR%3F%20ASP.NET%20SignalR%20is%20a%20library,process%20of%20adding%20real-time%20web%20functionality%20to%20applications.

2021-11-23 21:28:35
0

Se você deseja de forma assíncrona notificar um usuário (de conclusão ou de falha de qualquer coisa como uma tarefa), você pode usar a web de notificação por push (usando firebase de mensagens nuvem) ou SignalR sockets. Quando você usar uma tarefa de plano de fundo você perder o thread principal e, infelizmente, não há nenhuma maneira de responder para o usuário relacionado.

2021-11-23 20:31:11

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................