using (FileStream Fs = new FileStream(filePath, FileMode.Append))
{
StreamWriter streamWriter = new StreamWriter(Fs, Encoding.UTF8);
streamWriter.Write("Something...\n");
streamWriter.Close();
emailResertFs.Close();
}
Thread가 아니면 문제가 되지 않는 코드이지만 Thread면 문제가 달라진다.
저 코드가 일반적인 상황이 아닌 Thread를사용하면서각Thread가위의코드를 처리한다고가정하자.
운이 좋으면 지나가겠지만 그렇지 않으면 위와 같은 에러를 만나게 된다.
원인은 두개 이상의Thread가동시에txt파일에액세스 하려고 하면서 발생하는 문제이다.
이 문제를 간단히 해결해보자
해결책 -lock사용
위의 예제를 이렇게 바꿔보자
private object locker = new object(); //맴버변수로 위에서 따로 정의한다.
lock (locker)
{
using (FileStream Fs = new FileStream(filePath, FileMode.Append))
{
StreamWriter streamWriter = new StreamWriter(Fs, Encoding.UTF8);
streamWriter.Write("Something...\n");
streamWriter.Close();
emailResertFs.Close();
}
}
lock키워드는 블록 안에 있는 코드를 한Thread에서만사용할 수 있게 해주는 키워드이다.
참고로 만약 Blazor WebAssembly App 나오지 않는다면 Visual Studio를 최신버전으로 업데이터 해야 한다.
Blazor Server App은 2019버전부터 지원하는데, Blazor WASM은 2020년 5월에 추가되었다.
자.. 우리는 Blazor Server 와 Blazor WebAssembly app 중 하나를 선택해야 한다.
차이점을 알아야 선택할 수 있지 않을까?
차이점
아주 쉽고 간단하게 결론부터 말하면 Blazor Server App은 Server Side 개념, Blazor WebAssembly App은 Client Side 개념으로 이해하면 된다.
다시 말해, 우리가 만든 C# 코드가 서버에서 실행되냐 클라이언트에서 실행되냐 의 차이이다.
좀더 자세히 설명을 하자면 다음과 같다.
Server Model
1. C#코드가 서버에서 실행된다.
2. Javascript hooks는 DOM에 액세스하는데 사용한다.
3. SignalIR을 사용하여 브라우저와 서버 간에 정보를 바이너리로 주고받는다.
4. 만약 무언가가 변경되면 서버는 DOM 업데이트 메시지를 다시 보낸다.
WebAssembly Model
1. 클라이언트의 부러우저에서 실행된다.
2. 웹 요청 중 첫 번째 요청은 CLR, 어셈블리, JavaScript, CSS를 다운로드하는 요청이다.
3. 보안 WASM 샌드박스에서 실행된다.
4. Blazor Javascript 핸들러는 Dom에 액세스한다.
참고 SignalIR ??
SignalIR은 Blazor의 필수 부분이기 때문에 꼭 알아야 하며, 다음 기능을 제공한다.
1. 무료 오픈 소스이다.
2. 지속적으로 연결되어 비동기 메시지를 보낸다.
3. 연결은 양방향
SignalR 웹 소켓은 포트 80을 사용하며, 이는 서버에서 Azure SignalR Service로 오프로드 될 수 있으며,이를 통해 하루에 10 만 명의 동시 사용자와 1 억 개의 메시지가 허용된다. 무료 오퍼링은 하루에 20 명의 동시 사용자와 20,000 개의 메시지를 허용한다.