your programing

EndInvoke ()는 선택 사항입니까, 선택 사항입니까, 아니면 선택 사항이 아닙니까?

lovepro 2020. 12. 30. 19:49
반응형

EndInvoke ()는 선택 사항입니까, 선택 사항입니까, 아니면 선택 사항이 아닙니까?


모든 BeginInvoke ()가 EndInvoke ()와 일치해야하는지 여부에 대해 상충되는 의견을 읽었습니다. EndInvoke ()를 호출하지 않는 것과 관련된 누수 또는 기타 문제가 있습니까?


Delegate.EndInvoke는 이것을 호출 하는 것으로 문서화됩니다 (즉, 필요-그렇지 않으면 누출이 발생 함) -msdn에서 :

중요 사항

어떤 기술을 사용하든 항상 EndInvoke를 호출하여 비동기 호출을 완료하십시오.

Control.EndInvoke는 msdn 에서 발생하는 fire-and-forget 메서드를 무시해도 괜찮습니다 .

필요한 경우 EndInvoke를 호출하여 대리자에서 반환 값을 검색 할 수 있지만 필수는 아닙니다.

그러나- Delegate.BeginInvoke사용 ThreadPool.QueueUserWorkItem중이고 결과를 원하지 않으면 대신 사용 고려하십시오. 삶을 훨씬 쉽게 만들고 고통을 피할 수 있습니다 IAsyncResult.


EndInvoke는 선택 사항이 아닙니다.

여기에 더 많은 정보


EndInvoke 호출은 선택적 호출이 아니라 계약의 일부입니다. BeginInvoke를 호출하는 경우 EndInvoke를 호출해야합니다.

이것이 왜 필요한지에 대한 전형적인 예. BeginInvoke에서 반환 된 IAsyncResult가 연결된 리소스를 할당했을 가능성이 매우 높습니다. 가장 일반적으로 WaitHandle 종류입니다. IAsyncResult는 IDisposable을 구현하지 않으므로 리소스를 해제하려면 다른 위치를 선택해야합니다. 그렇게 할 수있는 유일한 곳은 EndInvoke입니다.

다음 블로그 게시물에서이 문제에 대해 간략하게 설명합니다.

http://blogs.msdn.com/jaredpar/archive/2008/01/07/isynchronizeinvoke-now.aspx


EndInvoke는 비동기 처리에서 문제가 발생하면 예외가 발생하는 장소이므로 선택 사항이 아닙니다.

어쨌든 IAsyncResult가 일부 네이티브 리소스를 보유하고 있다면 IDisposable을 올바르게 구현하고 GC가 종료자를 호출 할 때 이러한 리소스를 폐기해야하므로 누수가 없어야합니다.


BeginInvoke를 호출하면 WaitHandle을 사용하여 참조가 얼마나 많은지 카운트를 유지하는 커널 개체를 사용하므로 선택 사항이 아닙니다. EndInvoke를 호출하면 커널 개체에서 해당 카운터를 감소시키는 핸들이 정상적으로 삭제되고 해당 개수가 0에 도달하면 커널 개체 관리자가이를 제거합니다.


프로그램의 메모리가 매우 커지는 것을 신경 쓰지 않는 경우에만 선택 사항입니다. 문제는 어느 시점에서 EndInvoke를 호출하고 싶을 수 있기 때문에 GC가 스레드의 모든 참조를 보유하고 있다는 것입니다. 나는 Marc의 대답으로 갈 것입니다. threadpool은 당신의 삶을 더 쉽게 만들어 줄 것입니다. 그러나 스레드가 스핀 업할 수있는 스레드 수에 제한이 있기 때문에 스레드에서 스레드를 생성하는지주의해야합니다.


이 게시물에 대한 모든 답변은 EndInvoke ()가 선택 사항이 아니라고 말합니다. 그러나이 SO 스레드에 대한 대답으로 다음과 같은 높은 순위의 주석을 찾았습니다.

"Windows Forms 팀에서는 EndInvoke를 호출하지 않고도 Control.BeginInvoke를 '실행 후 잊어 버리는'방식으로 사용할 수 있음을 보장했습니다. 일반적으로 비동기 호출에는 해당되지 않습니다. 일반적으로 모든 BeginXXX에는 해당 EndXXX 호출이 있어야합니다. , 일반적으로 콜백에 있습니다. "

Invoke ()와 BeginInvoke ()의 차이점은 무엇입니까?

참조 URL : https://stackoverflow.com/questions/532722/is-endinvoke-optional-sort-of-optional-or-definitely-not-optional

반응형