2016-06-15 3 views
0

TCP/IP를 통해 일부 데이터를 읽는 중입니다. 어떤 이유로 시간 초과 예외가 발견되지 않습니다. 여기에 무슨 아이디어가 있니? 여기C# 시간 초과 예외가 발생하지 않았습니다.

try 
{ 
    Timer timer1 = new Timer(dcaika); 
    timer1.Elapsed += async (sender, e) => await HandleTimer(); 
    timer1.Start(); 
    memoryRes = dc.readBytes(libnodave.daveFlags, 0, 180, 1, memoryBuffer); 
    timer1.Stop(); 
} 
catch (TimeoutException) 
{ 
} 

과는 이벤트가 작동하는 방식 .NET 아니다

private static Task HandleTimer() 
{ 
    Console.WriteLine("timeout"); 
    throw new TimeoutException(); 
} 
+0

이 오타'캐치 (TimeoutException)'는'캐치 (TimeoutException 예) 수 shoulfd가'당신은'지정할 필요가 없습니다 @MairajAhmad – Mairaj

+2

은 계획하지 않는 ex'는 – dotnetom

+1

@dotnetom 감사를 사용하는 타이머가 경과하면 예외가 발생하고 타이머를 설정하는 루틴에서 해당 예외를 catch 할 것으로 예상됩니까? – Mairaj

답변

0

처리 시간 제한입니다. 스레드를 인터럽트하지 않습니다. 타이머의 유형에 따라 결정되는 컨텍스트에서 실행됩니다. 이 경우 (System.Timers.Timer) Timer.Elapsed 이벤트 처리기는 스레드 풀 스레드에서 호출됩니다. 따라서 이것은 try/catch과 완전히 다른 스레드에서 실행되므로 작동하지 않습니다.

기본적으로 시간 초과를 지원하지 않는 API에서 시간 초과를 강제 실행하려는 것 같습니다. 이 작업을 수행 할 수있는 확실한 방법은 없습니다. 따라서 가장 먼저 할 일은 누구든지 readBytes을 유지 관리하는 사람에게 제한 시간 지원을 요청하는 것입니다. 이

은이 같은 '가짜 시간 제한을 "할 수있는 방법 경우 : readBytes 전화을 멈추지 않을 것입니다

var timeoutTask = Task.Delay(dcaika); 
var readTask = Task.Run(() => dc.readBytes(libnodave.daveFlags, 0, 180, 1, memoryBuffer)); 
var completedTask = await Task.WhenAny(timeoutTask, readTask); 
if (completedTask == timeoutTask) 
    ... 
else 
    ... 

그러나이 방법 , 그래서 바이트 엉망 다른 읽기 아마 계속됩니다 연락. 그래서 나는 그것이 당신의 시나리오에서 효과가있을 것이라고 생각하지 않습니다.

관련 문제