2010-04-09 2 views
0

my asp .net mvc 프로젝트 클래스에서 저장소 메소드에 대한 시간 계산을 구현해야합니다. 문제는 WCF 서비스에 시간 계산 데이터를 보내야하는데 시간이 많이 소요된다는 것입니다. 비동기 적으로 WCF 서비스를 조정할 수있는 스레드에 대해 생각합니다. 그러나 나는 그것에 대한 경험이 거의 없다. 매번 새로운 스레드를 생성해야합니까, 아니면 글로벌 스레드를 생성 할 수 있습니까?메소드 실행 시간을 계산하고 비동기 WCF 서비스로 보내기

스톱워치 클래스

public class StopWatch 
{ 
    private DateTime _startTime; 
    private DateTime _endTime; 

    public void Start() 
    { 
     _startTime = DateTime.Now; 
    } 
    protected void StopTimerAndWriteStatistics() 
    { 
     _endTime = DateTime.Now; 
     TimeSpan timeResult = _endTime - _startTime; 
     //WCF proxy object 
     var reporting = AppServerUtility.GetProxy<IReporting>(); 
     //Send data to server 
     reporting.WriteStatistics(_startTime, _endTime, timeResult, "some information"); 
    } 

    public void Stop() 
    { 
     //Here is the thread I have question with 
     var thread = new Thread(StopTimerAndWriteStatistics); 
     thread.Start(); 
    } 
} 

내가 스레드 잘못 뭐하는 거지 저장소

public class SomeRepository 
{ 
    public List<ObjectInfo> List() 
    { 
     StopWatch sw = new StopWatch(); 
     sw.Start(); 
     //performing long time operation 
     sw.Stop(); 
    } 
} 

에 스톱워치 클래스의 사용 : 나는 그런 일이? 어떻게 성능상의 이유로 스레드를 재사용 할 수 있습니까?

답변

1

코드가 정상적으로 보입니다. 장기 실행 작업을 완료하면 새 스레드를 생성하고이 스레드에서 웹 서비스 호출을 수행합니다. 이것은 나에게 좋은 접근 방법 인 것 같다. 또 다른 방법은 웹 서비스 프록시 (/async 옵션이 svcutil.exe)에 의해 생성 된 BeginXXXEndXXX 메서드를 사용하는 것입니다.

+0

매번 새로운 스레드를 생성 할 때 성능상의 문제가 걱정됩니다. 이러한 작업에 전역 스레드 객체를 사용하는 것이 더 좋을까요? – wassertim

+0

전역 스레드 객체와 같은 것은 없습니다. 스레드를 수동으로 (이전처럼) 작성하거나 IO 완료 포트를 사용하는 BeginXXX, EndXXX 메소드를 사용하십시오. 호출 실행 중에는 스레드가 소비되지 않으므로 매우 효율적입니다. 이 경우 웹 서비스 호출은 주 스레드에서 시작되며이 주 스레드는 즉시 스레드 풀로 반환됩니다. –

+0

예 글로벌 스레드가 없습니다. 그러나 우리는 스레드를 어떻게 든 재사용 할 수 있습니까? 매번 새 스레드를 만드는 것이 효율적이지 않습니다. – wassertim

1

QueueUserWorkItem 메서드로 .NET ThreadPool을 사용하지 않는 이유는 무엇입니까? 스레드를 시작하는 것에 대해 걱정할 필요가 없습니다. 대기열에 넣고 완료하면됩니다.

당신은

ThreadPool.QueueUserWorkItem(new WaitCallback(StopTimerAndWriteStatistics)); 

같은 전화 것 또는 당신도 람다 식을 사용하고 StopTimerAndWriteStatistics 방법의 제거 얻을 수 있습니다. (이 테스트를 거치지 않았습니다.)

ThreadPool.QueueUserWorkItem(() => { 
    _endTime = DateTime.Now; 
    TimeSpan timeResult = _endTime - _startTime; 
    //WCF proxy object 
    var reporting = AppServerUtility.GetProxy<IReporting>(); 
    //Send data to server 
    reporting.WriteStatistics(_startTime, _endTime, timeResult, "some information"); 
            });