acessar o arquivo problema de thread diferente em Asp.net
-
02-07-2019 - |
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:
- Enviar Arquivo
- gravar e salvar informações a respeito de arquivo para banco de dados
- Importar dados de arquivo em banco de dados
- 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
}
}
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.