2010-05-05 4 views
0

다음은 C#입니다.메서드에 타이머를 추가하는 간단한 방법은 무엇입니까

나는 아주 간단한 것을하려고하고있다. (나는 생각한다). 나는 XML 문서

XDocument doc = XDocument.Load(uri); 

를로드하는 방법을 가지고,하지만 난 (등 연결, 문서 크기) 문제가있는 경우 PC의 자원을 묶어 싶지 않아요.

그래서 주어진 시간 (초) 후에 메서드를자를 수있는 시간 초과 변수를 추가하고 싶습니다. 나는 비동기 프로그래밍에 관해서는 초보자이며 너무 많은 예제들이 너무 많이 작성되어 있다는 것을 혼란스럽게 생각합니다. . . 그 중 어느 것도 단순 해 보이지 않습니다. 가능한 경우 간단한 해결책을 원합니다.

다음은 가능한 솔루션 경로에 지금까지 내 생각을이다 :

1) 기존로드

2

public XDocument LoadXDocument(string uri, int timeout){ //code } 
) 래퍼를 래핑하는 방법,하지만 확장 방법으로

XDocument doc = XDocument.LoadWithTimeout(string uri, int timeout); 

3) 일반적인 확장 방법입니다. 그것은 일반적으로 여러 메서드 호출에 시간 제한을 추가하고 특정 객체의 한 종류에 연결되지 수있는 의미 때문에 얼굴이 정말 좋은 것 같다,하지만 난 생각에

Object obj = SomeStaticClass.LoadWithTimeout(??? method, int timeout); 

3), 내가 하나가 있음) 불가능하거나 ii) 매우 어렵다.

도와주세요. 감사.

+0

프로그래밍 언어가 없습니다. C# 냄새. 그렇게 다시 태그 할 수 있습니까? – BalusC

답변

0

이 Windows 또는 웹입니까? 다시 태그하십시오.

Windows 인 경우 기본 스레드와 다른 스레드에서 해당 메서드를 실행하기 위해 백그라운드 작업자를 사용하는 것이 어떻습니까? 예를 들어 진행률 표시 줄을 사용하여 사용자가 작동 중임을 알리면 완료되면 필요한 경우 사용자에게 경고합니다.

에 난 그냥 방법 비동기

또는 뭔가를 누락을 실행하는 데 $.get를 사용하여, 예를 들어 jQuery를 사용하여 다음 새로운 페이지에 방법을 추가하고, 같은 일을 할 것인가? mwilson 대답에서


나는 당신이 정말로 시간 제한을 강제하기보다는 방법의 내부 시간 제한/오류를 사용하려는 생각합니다.

내 대답을 삭제하는 대신 누군가가 사용할 수 있도록 내 답변을 보냅니다.

+0

"내부 타임 아웃/오류를 사용하지 말고 타임 아웃을 강제 실행"이라고 말하면 무엇을 언급합니까? Tsiokos의 답이 하나의 예입니까? – John

0

이렇게하면 좋은 출발점이 될 것입니다.

public static XDocument GetDoc(string uri, int timeout) 
{ 
    var result = default(XDocument); 
    { 
     using (var client = new WebClient()) 
     using (var complete = new ManualResetEvent(false)) 
     { 
      client.DownloadStringCompleted += (sender, e) => 
      { 
       try 
       { 
        if (!e.Cancelled) 
        { 
         result = XDocument.Parse(e.Result); 
        } 
       } 
       finally 
       { 
        complete.Set(); 
       } 
      }; 

      client.DownloadStringAsync(new Uri(uri)); 
      Thread.Sleep(timeout); 
      if (!complete.WaitOne(1)) 
      { 
       client.CancelAsync(); 
      } 
      complete.WaitOne(); 
     } 
    } 
    return result; 
} 
관련 문제