Pergunta

Eu tenho um processo em um website (Asp.net 3,5 usando Linq-to-SQL para acesso a dados) que precisa de trabalho da seguinte forma:

  1. Enviar Arquivo
  2. gravar e salvar informações a respeito de arquivo para banco de dados
  3. Importar dados de arquivo em banco de dados
  4. Redirecionar para outra página

Quando executado sequencialmente como esta, tudo funciona bem. No entanto, uma vez que os arquivos que estão sendo importados pode ser muito grande, gostaria etapa 3 para executar em um segmento diferente do segmento. O usuário deve chegar à etapa 4, enquanto o passo 3 ainda está em andamento, ea tela na etapa 4 vai atualizar periodicamente para deixar o know usuário quando a importação for concluída.

Eu estou lidando com a rosca da seguinte forma:

public class Import {

  public static void ImportPendingFile() {
    Import i = new Import();
    Thread newThread = new Thread(new ThreadStart(i.ImportFile));
    newThread.Start();
  }

  public void ImportFile() {
    // 1. Query DB to identify pending file
    // 2. Open up and parse pending file
    // 3. Import all data from file into DB
    // 4. Update db to reflect that import completed successfully
  }
}

E no codebehind:

protected void butUpload(object sender, EventArgs e) {
  // Save file, prepare for import
  Import.ImportPendingFile();
  Response.Redirect(NewLocation);
}

Ao fazer isso, eu sou capaz de confirmar via depurador que o novo segmento está iniciando corretamente. No entanto, sempre que eu faço isso, os aborts rosca ao tentar acessar o arquivo (passo 2 no de trás de código). Esta multa funciona quando executado no thread principal, então algo sobre a situação de multi-threaded está impedindo isso. Eu tinha pensado que uma vez que o arquivo é salvo no disco (que é) que não deve haver qualquer problema com abrindo-o em um segmento diferente. Alguma idéia de onde eu ter dado errado e como posso corrigir isso? Obrigado!

Nota: Eu estou usando um terceiro conjunto para abrir o arquivo. Usando refletor, eu encontrei o seguinte código relacionado à forma como ele abre o arquivo:

if (File.Exists(fileName)) {
  using (FileStream stream = new FileStream(fileName, FileMode.Open)) {
    // use stream to open file
  }
}
Foi útil?

Solução

Tente Response.Redirect (url, false), então a 'resposta' será encerrada logo após essa chamada.

Outras dicas

estado da exibição ASP.NET é um ótimo recurso e uma ferramenta essencial para o desenvolvimento web de hoje. Ele mantém o estado de uma página à medida que viaja e para trás. Não há mais necessidade de se preocupar sobre como restaurar os valores de controles de página entre postbacks. Neste artigo você vai ter uma perspectiva mais aprofundada sobre o estado de exibição. Vamos falar sobre maneiras de reduzir carga desnecessária e proteger o estado de exibição de olhos curiosos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top