ASP.NET의 다른 스레드에서 파일에 액세스하는 데 문제가 있습니다
-
02-07-2019 - |
문제
웹 사이트 (데이터 액세스에 LINQ-to-SQL을 사용하는 ASP.NET 3.5)에 다음과 같이 작동 해야하는 프로세스가 있습니다.
- 파일 업로드
- 파일에 관한 정보를 데이터베이스에 기록하고 저장합니다
- 파일에서 데이터베이스로 데이터를 가져옵니다
- 다른 페이지로 리디렉션하십시오
이렇게 순차적으로 실행되면 모든 것이 잘 작동합니다. 그러나 가져 오는 파일이 상당히 클 수 있으므로 3 단계가 UI 스레드와 다른 스레드에서 실행 되려고합니다. 사용자는 4 단계로 가야하고 3 단계는 여전히 진행 중이며 4 단계의 화면은 주기적으로 업데이트되어 가져 오기가 완료된시기를 사용자에게 알립니다.
다음과 같이 스레딩을 처리하고 있습니다.
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
}
}
그리고 Codebehind에서 :
protected void butUpload(object sender, EventArgs e) {
// Save file, prepare for import
Import.ImportPendingFile();
Response.Redirect(NewLocation);
}
이 작업을 수행 할 때 디버거를 통해 새 스레드가 제대로 시작되고 있음을 확인할 수 있습니다. 그러나이 작업을 수행 할 때마다 파일에 액세스하려고 할 때 스레드가 중단됩니다 (뒤의 코드의 2 단계). 이것은 기본 스레드에서 실행될 때 잘 작동하므로 멀티 스레드 상황에 대한 무언가가이를 막는 것입니다. 파일이 디스크에 저장되었으므로 (그렇습니다) 다른 스레드에서 열기에는 아무런 문제가 없어야한다고 생각했습니다. 내가 잘못한 곳과 어떻게 고칠 수 있습니까? 감사!
참고 : 타사 어셈블리를 사용하여 파일을 열고 있습니다. 반사판을 사용하여 파일을 열어주는 방법과 관련된 다음 코드를 찾았습니다.
if (File.Exists(fileName)) {
using (FileStream stream = new FileStream(fileName, FileMode.Open)) {
// use stream to open file
}
}
해결책
response.redirect (url, false), 그렇지 않으면 '응답'은 그 호출 직후에 종료됩니다.
다른 팁
ASP.NET View State는 오늘날의 웹 개발을위한 훌륭한 기능이자 필수 도구입니다. 앞뒤로 이동할 때 페이지의 상태를 유지합니다. 포스트 백 사이의 페이지 제어 값을 복원하는 것에 대해 더 이상 걱정할 필요가 없습니다. 이 기사에서는보기 상태에 대한 심층적 인 관점을 얻게됩니다. 우리는 불필요한 페이로드를 줄이고 눈을 사로 잡는 상태에서보기 상태를 보호하는 방법에 대해 이야기 할 것입니다.