2017-10-09 44 views
2

情況是這樣的:我需要調用從ASP.NET第三方庫中的函數,但絕不允許異步運行

  • 我使用的是第三方庫做一些SPF檢查
  • 這些檢查是從ASP.NET網站
  • 第三方庫使用的很多做「等待/異步」的代碼,雖然我打電話非異步方法去做
  • 最的時候,w3wp(是的,實際的w3wp.exe)簡單地崩潰,出現以下錯誤:模仿的無效標記 - 它不能被複制「。

我假定這是因爲的await /異步抓起從具有某種上非法/怪異身份的線程池線程,所以我想知道是否有任何方法來調用一些代碼,並告訴.Net'忘記'異步/等待,並在同一個線程上同步運行。

+1

您可以創建一個自定義同步上下文,但只有在庫不會通過調用'ConfigureAwait(false)'來故意避免當前同步上下文的情況下才能工作*。不幸的是,這確實傾向於編寫圖書館。 –

+0

如果問題對於庫和使用情況非常特殊,它只會是可以爲您提供指導(或確認它可以與ASP.NET一起使用)的供應商。我懷疑事實是這個庫不是專爲ASP.NET環境設計的(因爲它似乎需要某些模擬設置)。 –

+0

@Damien_The_Unbeliever看起來庫不包含源代碼中任何地方的ConfigureAwait,所以我將探討自定義同步上下文的可能性。謝謝你的提示! – Drak

回答

0

我發現了一個解決方案:產品中的某處用戶正在使用identity.impersonate()模擬,但模擬上下文從未使用過.undo()'d。在確認identity.impersonate()被.undo()正確匹配後,問題就會停止。

我確實嘗試製作我自己的SynchronizationContext,但是在這種情況下,這並不起作用,因爲傳遞了剛剛通過'非法'模擬上下文的模擬。

相關問題