もうこんな時間かぁ。何もしてない訳では決してないんだけど、もうかぁ
JavaScriptでも切り替える余地が無かったら同じやでって記事があった。記憶違いかぁ。
JavaScriptはシングルスレッドで実行される \#JavaScript \- Qiita
JavaScriptの非同期処理の歴史 \#JavaScript \- Qiita
あと、JavaScriptにasync/awaitが入る前の非同期処理が、どんなだったか順番に分かる記事もあったのでメモ。
見直したらasyncメソッドの中でうっかりawait書いてて草。何の検証にもなってなかった。
改めてasyncメソッドでawait書かなかったら、同期メソッドの様に動いた。
[Warning] CS1998: この非同期メソッドには 'await' 演算子がないため、同期的に実行されます。'await' 演算子を使用して非ブロッキング API 呼び出しを待機するか、'await Task.Run(...)' を使用してバックグラウンドのスレッドに対して CPU 主体の処理を実行することを検討してください。あとideoneじゃなくVisualStudioに書いたら、普通に警告も出てた。
using System;
using System.Diagnostics;
using System.Threading.Tasks;
public class AsyncMethods {
public async Task FirstMethodAsync() {
Console.WriteLine("First async method started.");
Stopwatch stopwatch = Stopwatch.StartNew();
while (stopwatch.ElapsedMilliseconds < 1000) {}
stopwatch.Stop();
Console.WriteLine("First async method completed.");
}
public async Task SecondMethodAsync() {
Console.WriteLine("Second async method started.");
Stopwatch stopwatch = Stopwatch.StartNew();
while (stopwatch.ElapsedMilliseconds < 500) {}
stopwatch.Stop();
Console.WriteLine("Second async method completed.");
}
}
public class SyncMethods {
public void FirstMethod() {
Console.WriteLine("First sync method started.");
Stopwatch stopwatch = Stopwatch.StartNew();
while (stopwatch.ElapsedMilliseconds < 1000) {}
stopwatch.Stop();
Console.WriteLine("First sync method completed.");
}
public void SecondMethod() {
Console.WriteLine("Second sync method started.");
Stopwatch stopwatch = Stopwatch.StartNew();
while (stopwatch.ElapsedMilliseconds < 500) {}
stopwatch.Stop();
Console.WriteLine("Second sync method completed.");
}
}
public class Program {
public static async Task Main() {
AsyncMethods asyncMethods = new AsyncMethods();
SyncMethods syncMethods = new SyncMethods();
syncMethods.FirstMethod();
syncMethods.SecondMethod();
Task firstAsyncTask = asyncMethods.FirstMethodAsync();
Task secondAsyncTask = asyncMethods.SecondMethodAsync();
await Task.WhenAll(firstAsyncTask, secondAsyncTask);
Console.WriteLine("All methods have completed.");
}
}
https://ideone.com/pWJCKOtry catchしてどうなるかを確認してみた。
Unity loggingのLog.Error()
だとちゃんとStacktraceが出て、例外の発生行が分かった。
とはいえハンドリングの不要な例外を全部catchするのはmain()関数もないUnityでは無理だし、Stacktraceが失われてる訳じゃないなら、未catchのもうまい事やって欲しい所。Debug.LogException(e)
の場合、10行目はDebug.LogException(e)
なので発生行分からず
Object reference not set to an instance of an object
UnityEngine.Debug:LogException(Exception)
TryException:Start() (at Assets/TryException.cs:10)
Unity.Logging.Log.Error(e)
の場合、発生行が分かる。正確には17じゃなくて18行目だと思うが
"System.NullReferenceException: Object reference not set to an instance of an object
at TryException.ThrowException () [0x00000] in E:\dev\unity\try-unity-logging\Assets\TryException.cs:17
at TryException.Start () [0x00000] in E:\dev\unity\try-unity-logging\Assets\TryException.cs:8 "
TryException:Start() (at Assets/TryException.cs:11)
throw e
の場合、未catchと当然同じく発生行分からず
Object reference not set to an instance of an object
UnityEngine.Debug:CallOverridenDebugHandler(Exception, Object)
using System;
using UnityEngine;
public class TryException : MonoBehaviour {
private void Start() {
try {
this.ThrowException();
} catch (Exception e) {
Debug.LogException(e);
Unity.Logging.Log.Error(e);
throw e;
}
}
private void ThrowException() {
string[] array = null;
Debug.Log(array.Length); // 故意にnull参照エラーを発生させる
}
}
あーしまったこんな時間。今日もソシャゲの日課をやってなかった・・・
昨日は忙しかったからだけど、今日は休日だから勝手にやらなかっただけではあるが。30分でなんとかやらんと
Unity loggingでRedirectUnityLogs(log: true)
だと、未catchの例外のStacktraceが消滅してしまう問題を追いかけている。とりあえず1.0.16でも1.2.0でも残念ながら変化は無かった。
Unity logging未使用 or RedirectUnityLogs(log: false)
の場合...
NullReferenceException: Object reference not set to an instance of an object
TryException.ThrowException () (at Assets/TryException.cs:10)
TryException.Start () (at Assets/TryException.cs:6)
RedirectUnityLogs(log: true)
の場合...
Object reference not set to an instance of an object
UnityEngine.Debug:CallOverridenDebugHandler(Exception, Object)
RedirectUnityLogs(log: true)
は諦めるしかないだろうか・・・using Unity.Logging;
using Unity.Logging.Sinks;
using UnityEngine;
using Logger = Unity.Logging.Logger;
public static class LoggerConfigure {
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
public static void Initialize() {
Log.Logger = new Logger(
#if UNITY_EDITOR
EditorConfiguration()
#endif
);
}
private static LoggerConfig EditorConfiguration()
=> new LoggerConfig()
.SyncMode.FatalIsSync()
.RedirectUnityLogs(log: false)
.WriteTo.UnityEditorConsole();
}
using UnityEngine;
public class TryException : MonoBehaviour {
private void Start() {
this.ThrowException();
}
private void ThrowException() {
string[] array = null;
Debug.Log(array.Length); // 故意にnull参照エラーを発生させる
}
}
Packages/manifest.json書き換えてUnity logging 1.2.0にする分には普通に入る。依存解決でburst, collectionsのバージョンも上がって、test-frameworkとかも入るみたいだけど、別に問題は無さそう。
少なくとも、Unity logging 1.2.0が入った状態で即Consoleにエラーが出るとかは無い。
https://docs.unity3d.com/Packages/com.unity.logging@1.2/changelog/CHANGELOG.html
一方で、Changelog見ると1.2.0は"*Release Preparation"とだけ書いててなんか変。1.2.0はなんかの間違いだったりするんかな?
1.1.0はリリースされなかったみたいなので、実は1.0.16が正式なリリースでは最新とかか?よく分からん。
https://github.com/needle-mirror/com.unity.logging/compare/1.0.16...1.2.0
Misskeyは長文行けるからついでに1.0.16...1.2.0の差分URLも置いとこ
UnityプロジェクトにインストールされてるUnity Loggingと、ドキュメントで見れる最新バージョンが違う・・・
https://docs.unity3d.com/Packages/com.unity.logging@1.2/manual/index.html
ドキュメントではUnity Logging@1.2がUnity 2022.3.11f1以上で使える風に書いてある。
けど、Unity 2022.3.12f1にインストール出来るのは1.0.16。
なんで1.2が提示されないんだろう?