C#
Unity

Unity2018.3.3からasyncメソッドで例外がthrowされるとエラーが止まらなくなる。


発生する現象

タイトル通り。

しかも、EditorModeに戻ってもエラーが吐かれ続ける。


環境

・Unity 2018.3.3~


再現手順

↓のスクリプトを1つ用意してボタンを押すだけで簡単に再現します。

2019-2-7_19-29-52.png

2019-2-7_19-30-16.png


原因らしきもの

UnitySynchronizationContext内で、Queueに積まれたWorkRequestをInvokeする部分の実装が2018.3.3から変わっている事が原因と思われます。

dnす(ryで見てみると、↓がUnity2018.3.2までの実装

2019-2-7_10-38-48.png

↓がUnity2018.3.3からの実装

2019-2-6_14-43-19.png

となっており、WorkRequestをInvokeするまでは溜まったWorkRequestがClearされないという実装に変わっている事がわかります。

つまり、Invoke()でThrowが走るとClearされずに次のフレームでも同じWorkRequestがInvokeされるようです。

ただ、github上のmasterではUnity2018.3.2のバージョンのコードが公開されています。

masterが最新のリリースのものではないという事でしょうか。

https://github.com/Unity-Technologies/UnityCsReference/blob/master/Runtime/Export/UnitySynchronizationContext.cs#L68-L79

2019-2-7_19-36-47.png


対策

①asyncを使いたい場合は、2018.3.3以降のアップデートは保留にしてUnityの対応を待つ

②自家製SynchronizationContextを作ってAsyncOperationManager.SynchronizationContextを乗っ取る

③Task+SynchronizationContextではなく、UniTaskを使う。

SnapCrab_NoName_2019-2-9_22-48-18_No-00.png

あと、バグレポは送りましたが、2018.3.4で修正されてないのでいつ直るかはわかりません。