본문 바로가기

[NUnit] Callback 방식의 API 테스트하기 [Test] public async void Login() { var t = new TaskCompletionSource(); Auth.Login( (result) => { t.TrySetResult(result); }); var loginResult = await t.Task; Assert.Equals(loginResult, true); } Setup 등의 메소드에서는 async 키워드를 사용할 수 없다. t.Task.Wait() 메소드를 호출해서 강제로 대기해야 한다. 더보기
[Unity] Unhandled Exception 처리하기 public void AddExceptionHandler() { // 유니티 메인 스레드가 아닌 다른 스레드에서 발생한 익셉션은 여기로 핸들링됩니다. AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; #pragma warning disable 0618 // 유니티 스레드에서 발생된 익셉션은 여기로 핸들링됩니다. UnityEngine.Application.RegisterLogCallback((condition, stackTrace, type) => { if (type != LogType.Exception) return; SendLog(condition, stackTrace); }); #pragma warning r.. 더보기
[C#] Thread.Abort시에도 안전한 코드 작성하기 private static int g = 0; static void Foo() { while (true) { try { } finally { for (int i = 0; i < 100; i++) g++; } } } static void Main(string[] args) { var t = new Thread(Foo); t.Start(); Console.Read(); Console.WriteLine("ABORT"); t.Abort(); Console.WriteLine(g); Console.Read(); } Thread.Abort가 일어나면 작업이 중간에 끊기게 된다,만약 해당 스레드가 전역적인 상태(위의 예제에서는 g)를 건드리는 코드가 포함되었을 경우에는 상태가 망가져 프로그램 전체가 오작동하게 되는 원.. 더보기