'MS/C#'에 해당되는 글 24건
- 2009.01.24 델리게이트와 이벤트
- 2009.01.24 Thread 동기화 Collection류
- 2009.01.24 Thread 동기화 문제 static일 경우
사용 하는 방법만
간단히 보자..
namespace CSharpExample { public delegate void Defeat();//이벤트 등록을위한 델리게이트 public class Zealot { public void Attack() { Console.WriteLine("Zealot Attacked !!"); } } public class Dragon { public void Attack() { Console.WriteLine("Dragon Attacked !!"); } } public class Carrier { public void Attack() { Console.WriteLine("Carrier intercepter Attacked !!"); } } public class Group { private event Defeat EnemyDetected; //이벤트 델리게이트 필드 public void AddCombatUnit(Defeat unit) { EnemyDetected += unit;//이벤트시 실행 함수 추가 부분 } public void AttackEnemy() { EnemyDetected();//이벤트 실행.. 등록되있는 모든 함수 실행한다 }//만약에 중간에 예외처리로 thorw된다면 그 다음 이벤트는 수행 되지 않음 } public class Starcraft4 { [STAThread] public static void Main() { Zealot unit10 = new Zealot(); Dragon unit20 = new Dragon(); Carrier unit30 = new Carrier(); Group group1 = new Group(); group1.AddCombatUnit(new Defeat(unit10.Attack));//이벤트에 추가 group1.AddCombatUnit(new Defeat(unit20.Attack));//이벤트에 추가 group1.AddCombatUnit(new Defeat(unit30.Attack));//이벤트에 추가 group1.AttackEnemy();//이벤트 발생(실행한다) } } }
Collection 에서 제공하는 SyncRoot이용
사용예)
public class ICollectionSync{ private Int32[ ] intArr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; public void SyncRun(){ ICollection c = intArr; lock(c.SyncRoot){ IEnumerator e = c.GetEnumerator(); while(e.MoveNext()){ Console.Write((int)e.Current +"t"); try{ Thread.Sleep(20); }catch{ } } Console.WriteLine("요소갯수:{0} ", c.Count); }//lock } }//class
동기화시 가장 많이 사용하는 키워드는 lock
하지만 lock사용시 인수가 static일경우 사용 방법이 조금 틀리다
기본적으로 lock을 걸 경우 간단하게 내부 필드일 경우 this를 사용하면 되지만
static일경우 바로 lock을 사용할시 에러..
그렇다면??
typeof(클래스명)
이러한 형태로 나타내 줘야 한다
Object는??
더욱 간단하다
클래스명.object
이련형태로 lock을 결면 성공~!!!
사용 예)
public class Top{ private static int limit = 0; public void SayHello(){ int hash = Thread.CurrentThread.GetHashCode(); int count =0; lock(typeof(Top)){ while(count<10){ Console.WriteLine("Thread " + hash + ":" + limit++); count++; Thread.Sleep(10); } }//lock } } Object일 경우) public class Top{ private static object obj = new object(); public void SayHello(){ int hash = Thread.CurrentThread.GetHashCode(); int count =0; lock(Top.obj){ while(count<10){ Console.WriteLine("Thread " + hash + ":" + count++); Thread.Sleep(10); } }//lock } }