/// <summary></summary>
private Byte[] _ReceiveBytes(Int32 size)
{
MemoryStream memory = null;
SocketAsyncEventArgs args = null;
EventHandler<SocketAsyncEventArgs> completed = null;
Exception exception = null;
Int32 last_update = Environment.TickCount;
Boolean finished = false;
Int32 count = 0;
Int32 received = 0;
completed = new EventHandler<SocketAsyncEventArgs>((s, e) =>
{
try
{
count = e.BytesTransferred;
last_update = (count > 0 ? Environment.TickCount : last_update);
memory.Write(e.Buffer, 0, count);
received += count;
finished = (received == size);
if (!finished)
{
count = Math.Min(_ChunkSize, size - received);
args.SetBuffer(new Byte[count], 0, count);
if (!_Socket.ReceiveAsync(e))
{
completed(s, e);
}
}
}
catch (Exception ex)
{
exception = ex;
}
});
using (memory = new MemoryStream())
using (args = new SocketAsyncEventArgs())
{
count = Math.Min(_ChunkSize, size - received);
args.SetBuffer(new Byte[count], 0, count);
args.Completed += completed;
if (!_Socket.ReceiveAsync(args))
{
completed(_Socket, args);
}
while (!finished)
{
Thread.Sleep(_SleepTimeSpan);
if (exception != null)
{
throw new Exception(_ReceiveExceptionMessage, exception);
}
else if (!finished && Environment.TickCount - last_update > _ReceiveTimeout)
{
throw new TimeoutException(_TimeoutExceptionMessage);
}
}
return memory.ToArray();
}
}
1
A
답변
2
문제가 있습니다. "finished"는 휘발성 일 필요가 있지만 반드시 사용할 수는 없습니다. MRE를 사용하십시오. OverflowException에서 시간 초과 코드가 충돌 할 수 있습니다. 예외를 번역하고 있습니다.
그러나이 방법은 의미가 없으므로 비동기 작업이 완료 될 때까지 기다리지 않아도됩니다. 타임 아웃 예외를 얻으려면 Socket.ReceiveTimeout을 사용하십시오.
+0
나는이 경우 완결해야한다고 생각하지 않는다. http://stackoverflow.com/questions/59422/is-a-bool-read-write-atomic-in-c – ChaosPandion
관련 문제
- 1. NetworkStream과 Socket 클래스의 차이점은 무엇입니까?
- 2. .NET에서 Socket 클래스를 조롱 한 사람이 있습니까?
- 3. ASP.NET, 비동기, 언제 사용합니까?
- 4. Java에서 Socket 클래스를 인스턴스화하는 방법은 무엇입니까?
- 5. 왜 ReadDirectoryChangesW를 비동기 적으로 사용합니까?
- 6. 이것은 MySQL 열거 형 데이터 유형을 적절하게 사용합니까?
- 7. 중첩 된 클래스를 잘 사용합니까?
- 8. 이 Grails 클래스의 관계를 적절하게 계단식으로 구성하려면 어떻게해야합니까?
- 9. clojure에서 클래스의 클래스를 확인 하시겠습니까?
- 10. UML에서 중첩/하위 클래스를 어떻게 적절하게 모델링 할 수 있습니까?
- 11. KVO 바위. 이제 비동기 적으로 어떻게 사용합니까?
- 12. 비동기식 프로세스를 시작한 클래스의 비동기 청취
- 13. flash.utils.Dictionary를 SharedObject에 적절하게 serialize
- 14. ruby socket issue
- 15. socket-over-ssh factory
- 16. php socket tutorials
- 17. java in socket permission
- 18. Missed Socket Message
- 19. feof blocks on socket
- 20. Java - Strange hanging socket?
- 21. 자바 스크립트에서 상태를 콜백에 전달하면 클로저가 적절하게 사용됩니까?
- 22. 각 비동기 이미지 다운로드에 대한 새 대리자 클래스를 만드시겠습니까?
- 23. CursorTreeAdapter 클래스의 getChildrenCursor() 메서드에서 데이터베이스를 비동기 적으로 쿼리하는 패턴
- 24. socket, java를 생성하는 중 SocketTimeOutException이 발생했습니다.
- 25. 이름이 같은 네임 스페이스의 클래스를 사용합니까?
- 26. 정의에 액세스하지 않고 헤더 파일에서 클래스를 사용합니까?
- 27. php : 언제 추상 및 인터페이스 클래스를 사용합니까?
- 28. JAXB 상속, 정렬 된 클래스의 서브 클래스에 비동기 호출
- 29. C# Socket, 송신 중 경과 시간
- 30. 비 활동 객체에 적절하게 액티비티 전달하기
검토 용 코드 게시 가능성은 http://stackoverflow.com/questions/405009/so-community-code-reviews에서 논의되었습니다. 그것이 실제로 일어나는 것을 보면서, 나는 당신이 많은 해답을 얻는 지 의심 스럽다. 적어도 동료는 코드를 검토하기 위해 돈을 지불해야합니다. Q/A 형식의 아이디어는 여러 사람이 똑같은 질문을하고 잘 만들어진 답변을 얻을 수 있다는 것입니다. 리뷰와 함께, 그렇게 많이 ... –
나는 많이 의심합니다. 어떤 종류의 영혼이 관심이있는 경우를 대비하여 나는 아직도 그것을 유지하고 싶습니다. – ChaosPandion
당신은 관심사이고 일반적인 질문을 공식화하는 문제를 골라 내야합니다. 우리는 더 일반적으로 대답 할 수 있고, 비슷한 문제에 직면하는 사람은 계속해서 대답을 반복해서 사용할 수 있습니다. –