2 回答

TA貢獻1777條經(jīng)驗 獲得超10個贊
日志消息很簡單,并解釋了正在發(fā)生的事情:
你有一個異步任務
該異步任務正在訪問一個已經(jīng)被釋放的對象,可能是因為您的工作流中有一些競爭條件,異步工作流中的一個對象與需要它的工作流的另一部分無序釋放。 這意味著這個工作流程中的某些東西被嚴重破壞了。
異步任務從不等待,要么與 await 異步,要么(不要這樣做?。┡c Result 或 Wait 同步。這意味著永遠不會采用異常延續(xù)路徑,并且任務在收集它時會注意到這一點。同樣,如果您有一項從不等待結(jié)果的任務,那么您的工作流程中可能會出現(xiàn)嚴重問題。將這一事實與前一點的事實相結(jié)合:我們現(xiàn)在有兩個證據(jù)相互支持,表明此工作流程中存在嚴重問題,并且它涉及一個未等待的任務,而該任務本應確保排序約束.
因此,您在終結(jié)器線程上遇到異常,這真的很糟糕。
由于它在功能上有效,我一直忽略它
我曾經(jīng)聽說,當一家工廠著火并被燒毀時,平均有七種不同的安全系統(tǒng)被人們忽視或禁用。擺脫這種認為它有效的習慣,所以它必須是安全的。也許沒什么,但我會認為這些消息表明存在嚴重問題,直到我有其他證據(jù)。

TA貢獻1798條經(jīng)驗 獲得超7個贊
我也遇到了一個有 3rd 方庫導致錯誤的地方。我想在 CloudWatch 之外記錄它。為了防止 Lambda 記錄這些,我能夠做一些邪惡的反射來重置事件處理程序。
這是您自己執(zhí)行此操作的代碼。請注意這是邪惡的代碼。它很脆弱,并且會在 CLR 中的代碼更改或即使編譯器進行優(yōu)化(最近發(fā)生的)時中斷。但是,這是我能找到退出 Lambda 提供的此功能的唯一方法
private void ReplaceLambdaDefaultUnobservedTaskException()
{
try
{
var bindingFlags = BindingFlags.NonPublic | BindingFlags.Static;
Type type = typeof(TaskScheduler);
var field = type.GetField("_unobservedTaskException", bindingFlags);
if (field == null)
{
field = type.GetField("UnobservedTaskException", bindingFlags);
}
var handler = new EventHandler<UnobservedTaskExceptionEventArgs>(TaskSchedulerOnUnobservedTaskException);
field.SetValue(null, handler);
}
catch (Exception ex)
{
logger.Warning(ex, "Unable to do evil reflection.");
}
TaskScheduler.UnobservedTaskException += TaskSchedulerOnUnobservedTaskException;
}
private void TaskSchedulerOnUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
e.SetObserved();
logger.Error(e.Exception, "Lambda threw an UnobservedTaskException");
}
- 2 回答
- 0 關(guān)注
- 318 瀏覽
添加回答
舉報