ICorProfilerInfo3::RequestProfilerDetach 方法
指示該執行階段中斷與分析工具的連結。
語法
HRESULT RequestProfilerDetach(
[in] DWORD dwExpectedCompletionMilliseconds);
參數
dwExpectedCompletionMilliseconds
[in]Common Language Runtime (CLR) 應該等候的時間長度,再檢查是否安全卸除分析工具。
傳回值
這個方法會傳回下列特定的 HRESULT,以及表示方法失敗的 HRESULT 錯誤。
HRESULT | 描述 |
---|---|
S_OK | 中斷連結要求有效,而且現在中斷連結程序會在另一個執行緒上繼續。 中斷連結全部完成時,會發生 ProfilerDetachSucceeded 事件。 |
E_CORPROF_E_CALLBACK3_REQUIRED | 分析工具失敗了 ICorProfilerCallback3 介面的 IUnknown::QueryInterface 嘗試,其必須實作以支援卸離作業。 未嘗試中斷連結。 |
CORPROF_E_IMMUTABLE_FLAGS_SET | 因為分析工具在啟動時將旗標設定為不可變,造成無法中斷連結。 未嘗試中斷連結;分析工具仍然完整連結。 |
CORPROF_E_IRREVERSIBLE_INSTRUMENTATION_PRESENT | 中斷連結是不可能的,因為分析工具使用檢測的通用中繼語言 (CIL) 程式代碼,或插入 enter /leave 的攔截。 未嘗試中斷連結;分析工具仍然完整連結。注意 檢測的 CIL 是程式代碼,是由分析工具使用 SetILFunctionBody 方法所提供的程式代碼。 |
CORPROF_E_RUNTIME_UNINITIALIZED | 在受管理的應用程式中,執行階段尚未初始化。 (也就是說,運行時間尚未完全載入。當分析工具回呼的 ICorProfilerCallback::Initialize 方法內要求卸離時,可能會傳回此錯誤碼。 |
CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT | RequestProfilerDetach 在不支援的時間呼叫。 如果在 Managed 線程上呼叫 方法,但不是從 ICorProfilerCallback 方法或無法容許垃圾收集的 ICorProfilerCallback 方法內呼叫方法,就會發生這種情況。 如需詳細資訊,請參閱 CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT。 |
備註
在中斷連結程序中,中斷連結的執行緒 (專為對分析工具中斷連結所建立的執行緒) 偶爾會檢查是否所有執行緒都結束分析工具的程式碼。 分析工具應該透過 dwExpectedCompletionMilliseconds
參數提供所需時間的估計。 要使用的理想值是分析工具花在任何指定的 ICorProfilerCallback*
方法上所需的典型時間量;此值不應小於分析工具預期所需最大時間量的一半。
中斷連結執行緒使用 dwExpectedCompletionMilliseconds
來決定睡眠多久之後,再檢查分析工具回呼程式碼是否已迅速卸離所有堆疊。 雖然下列演算法的詳細資料可能會在未來版本中的 CLR 有所變更,它也說明了一種 dwExpectedCompletionMilliseconds
能夠用來判斷何時可安全卸載分析工具的方式。 中斷連結執行緒先睡眠 dwExpectedCompletionMilliseconds
毫秒。 如果從睡眠喚醒之後,CLR 發現分析工具回呼程式代碼仍然存在,卸離線程會再次進入睡眠狀態,這次會持續兩次 dwExpectedCompletionMilliseconds
毫秒。 從這個第二個睡眠狀態喚醒後,如果卸離執行緒發現分析工具回呼程式碼仍然存在,它會睡眠 10 分鐘後再檢查一次。 中斷連結執行緒會每隔 10 分鐘重新檢查一次。
如果分析工具指定 dwExpectedCompletionMilliseconds
為 0 (零) 時,CLR 會使用預設值為 5000,這表示它會在 5 秒後執行檢查,接著 10 秒後再次檢查,然後之後每隔 10 分鐘一次。
需求
平台:請參閱系統需求。
標頭: CorProf.idl、CorProf.h
程式庫:CorGuids.lib
.NET Framework 版本: 自 4 起提供