2 回答

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

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊
我也遇到了一個(gè)有 3rd 方庫(kù)導(dǎo)致錯(cuò)誤的地方。我想在 CloudWatch 之外記錄它。為了防止 Lambda 記錄這些,我能夠做一些邪惡的反射來(lái)重置事件處理程序。
這是您自己執(zhí)行此操作的代碼。請(qǐng)注意這是邪惡的代碼。它很脆弱,并且會(huì)在 CLR 中的代碼更改或即使編譯器進(jìn)行優(yōu)化(最近發(fā)生的)時(shí)中斷。但是,這是我能找到退出 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)注
- 346 瀏覽
添加回答
舉報(bào)