LoginSignup
4
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-02-07

追記(2019/3/8)

コチラの問題について、2018.3.7f1で解決されている事を確認しました。

発生する現象

タイトル通り。
しかも、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で修正されてないのでいつ直るかはわかりません。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1