'MS/C#'에 해당되는 글 24건

  1. 2009.01.24 델리게이트와 이벤트
  2. 2009.01.24 Thread 동기화 Collection류
  3. 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();//이벤트 발생(실행한다)
        }
    }
}

And

Thread 동기화 Collection류

|

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

And

Thread 동기화 문제 static일 경우

|

동기화시 가장 많이 사용하는 키워드는 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
 }
}

And
prev | 1 | ··· | 4 | 5 | 6 | 7 | 8 | next