2012-01-16 4 views
0

ASP.NET에서 C#을 사용하여 웹 페이지를 개발 중입니다.monitor.enter (lock) issue

많은 사용자가 동시에 해당 페이지에 액세스 할 수 있습니다.

버튼 클릭시 중요한 섹션이있는 함수를 호출하고 있습니다.

나는 두 사용자가 동시에 기능에 액세스하는 경우 이제 가정

try 
{ 
    moniter.enter(lock)   
    salbapi.Sislemcu_Epayroll_Salffs_Bapi(Saljv_str, "N", out messdata, ref Saljv_table); 
} 
catch(Exception e) 
{ 
} 
finally 
{ 
    moniter.exit(lock). 
} 

에 그 코드를 삽입했다.

처리 결과 메시지가 교환되거나 교환되지 않습니다 (잘못된 메시지가 사용자에게 표시됨).

이렇게해서는 안됩니다.

+0

당신이 코드는 하나의 작업자 프로세스에서 실행되고 확실

class Foo { static object synch = new object(); void TheMethod() { lock (synch) { salbapi.Sislemcu_Epayroll_Salffs_Bapi(...); } } 

}과 같은 일을 할 것인가? 그렇지 않으면 원하는 모든 모니터를 만들 수 있지만 프로세스 간에는 동기화되지 않습니다. –

+0

@kumar 만약 답 중 하나가 당신이 요구하는 답이라면, 그 답으로 표시하는 것이 좋은 형태입니다. –

답변

0

이 스레드가 안전한지 묻고 있습니까? 모든 스레드에 잠금 변수의 가시성이있는 경우 그렇습니다.

하나의 스레드가 메서드를 호출하고 잠금을 획득 한 경우 첫 번째 스레드가 Monitor.Exit을 호출 할 때까지 들어오는 다른 스레드는 Monitor.Enter에서 기다려야합니다. 중요한 코드는 상관없이 얼마나 많은 동시 페이지 요청 응용 프로그램 내에서 한 번에 한 번 실행되지 않습니다 보장

0
lock(Application["Lock"]) 
{ 
    salbapi.Sislemcu_Epayroll_Salffs_Bapi(Saljv_str, "N", out messdata, ref  Saljv_table); 
} 

. 나는 위해 Application_Start에의 Global.asax에 Application["Lock"]를 초기화하는 것이 좋습니다 :

public class Global : System.Web.HttpApplication 
{ 
    protected void Application_Start(object sender, EventArgs e)   
    { 
     Application["Lock"] = new object(); 
    } 

    //other handlers 
} 

나는 또한 고정 분명한 교착 상태의 위험이 다른 곳을 재사용하지 않도록 당신이 VAR을위한 더 나은 이름으로 올 제안 .

+0

나는 그것을 사용했지만 잠금 내부의 코드가 한 번 더 실행되고있다 ' –

+0

편집을 참조하십시오. 페이지 인스턴스간에 공유되는 잠금 객체를 사용해야합니다. 페이지에 대한 각 요청이 주어진 페이지 클래스의 새로운 인스턴스를 생성하므로 클래스 범위를 가진 잠금 변수는 요청간에 공유되지 않습니다. –

0

짧은 답변 튜더가 맞습니다. 긴 대답 :

moniter.enter는이 로직에 대해 약간 낮은 레벨입니다. 'monitor.enter();에 대한 설탕 인 lock 문을 사용해보십시오. {...} 마침내 (출구 모니터) '를 시도하십시오. 또한 예외를 잡아 먹는 것은 매우 나쁜 형태입니다. 예외가 거품이 나도록보고하십시오.

나는

+0

동기화가 클래스 수준 var이기 때문에 페이지 이벤트 핸들러의 컨텍스트에서이 작업이 실패합니다. 요구 사항을 충족하기 위해 아래에서 내 대답에 따라 응용 프로그램 수준 var를 사용해야합니다 (또는 단일 항목, 동일한 효과를 정의해야합니다). –

+0

마일스가 정확합니다. 나는 그것을 정적으로 만드는 것을 의미했다. –

+0

@RichardSchneider 저를 위해 일하고 있지만 문제는 2 명의 사용자가이 문제에 액세스 할 때입니다. 두 번째 사용자는 1 일까지 기다렸다가 둘 다 완료되면 1 차 사용자의 결과가 두 번째로 표시되고 그 반대의 경우도 마찬가지입니다 ... 왜 이것이 과장된 이유인지 모르겠습니까? –