728x90
반응형
728x170
▶ Program.cs
using System;
namespace TestProject
{
/// <summary>
/// 프로그램
/// </summary>
class Program
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 난수 발생기
/// </summary>
private static Random _random = null;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 프로그램 시작하기 - Main()
/// <summary>
/// 프로그램 시작하기
/// </summary>
private static void Main()
{
_random = new Random(DateTime.Now.Millisecond);
ListQueue<int> queue = new ListQueue<int>();
using(RepeatWorker worker1 = new RepeatWorker())
{
worker1.SleepTime = 1000;
worker1.WorkAction = p => EnqueueItem(queue);
worker1.Start();
using(RepeatWorker worker2 = new RepeatWorker())
{
worker2.SleepTime = 500;
worker2.WorkAction = p => DequeueItem(queue);
worker2.Start();
Console.ReadKey(true);
}
}
}
#endregion
#region 항목 넣기 - EnqueueItem(parameter)
/// <summary>
/// 항목 넣기
/// </summary>
/// <param name="parameter">매개 변수</param>
private static void EnqueueItem(object parameter)
{
ListQueue<int> queue = parameter as ListQueue<int>;
int value = _random.Next(0, 100);
queue.EnqueueItem(value);
Console.WriteLine("ENQUEUE ITEM : {0}", value);
}
#endregion
#region 항목 꺼내기 - DequeueItem(parameter)
/// <summary>
/// 항목 꺼내기
/// </summary>
/// <param name="parameter">매개 변수</param>
private static void DequeueItem(object parameter)
{
ListQueue<int> queue = parameter as ListQueue<int>;
int value = queue.DequeueItem();
Console.WriteLine("DEQUEUE ITEM : {0}", value);
}
#endregion
}
}
728x90
▶ SafeList.cs
using System;
using System.Collections.Generic;
namespace TestProject
{
/// <summary>
/// 스레드 안전 리스트
/// </summary>
/// <typeparam name="T">항목 타입</typeparam>
public class SafeList<T> : List<T>
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Protected
#region Field
/// <summary>
/// 동기 객체
/// </summary>
protected object syncObject;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Property
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 카운트 - Count
/// <summary>
/// 카운트
/// </summary>
public new int Count
{
get
{
lock(this.syncObject)
{
return base.Count;
}
}
}
#endregion
#region 인덱서 - this[index]
/// <summary>
/// 인덱서
/// </summary>
/// <param name="index">인덱스</param>
/// <returns>항목</returns>
public new T this[int index]
{
get
{
lock(this.syncObject)
{
return base[index];
}
}
set
{
lock(this.syncObject)
{
base[index] = value;
}
}
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - SafeList()
/// <summary>
/// 생성자
/// </summary>
public SafeList()
{
this.syncObject = new Object();
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 항목 추가하기 - AddItem(item)
/// <summary>
/// 항목 추가하기
/// </summary>
/// <param name="item">항목</param>
public void AddItem(T item)
{
lock(this.syncObject)
{
Add(item);
}
}
#endregion
#region 항목 삽입하기 - InsertItem(index, item)
/// <summary>
/// 항목 삽입하기
/// </summary>
/// <param name="index">인덱스</param>
/// <param name="item">항목</param>
public void InsertItem(int index, T item)
{
lock(this.syncObject)
{
Insert(index, item);
}
}
#endregion
#region 항목 제거하기 - RemoveItemAt(index)
/// <summary>
/// 항목 제거하기
/// </summary>
/// <param name="index">인덱스</param>
public void RemoveItemAt(int index)
{
lock(this.syncObject)
{
RemoveAt(index);
}
}
#endregion
#region 항목 제거하기 - RemoveItem(item)
/// <summary>
/// 항목 제거하기
/// </summary>
/// <param name="item">항목</param>
/// <returns>처리 결과</returns>
public bool RemoveItem(T item)
{
lock(this.syncObject)
{
return Remove(item);
}
}
#endregion
#region 데이터 제거하기 - ClearData()
/// <summary>
/// 데이터 제거하기
/// </summary>
public void ClearData()
{
lock(this.syncObject)
{
Clear();
}
}
#endregion
}
}
300x250
▶ ListQueue.cs
namespace TestProject
{
/// <summary>
/// 리스트 큐
/// </summary>
/// <typeparam name="T">항목 타입</typeparam>
public class ListQueue<T> : SafeList<T>
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 항목 넣기 - EnqueueItem(item)
/// <summary>
/// 항목 넣기
/// </summary>
/// <param name="item">항목</param>
public void EnqueueItem(T item)
{
lock(this.syncObject)
{
Add(item);
}
}
#endregion
#region 항목 엿보기 - PeekItem()
/// <summary>
/// 항목 엿보기
/// </summary>
/// <returns>항목</returns>
public T PeekItem()
{
lock(this.syncObject)
{
if(base.Count > 0)
{
return this[0];
}
else
{
return default(T);
}
}
}
#endregion
#region 항목 꺼내기 - DequeueItem()
/// <summary>
/// 항목 꺼내기
/// </summary>
/// <returns>항목</returns>
public T DequeueItem()
{
lock(this.syncObject)
{
if(Count > 0)
{
T item = this[0];
RemoveAt(0);
return item;
}
else
{
return default(T);
}
}
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > Common' 카테고리의 다른 글
[C#/COMMON] 진수 변환하기 (0) | 2018.12.09 |
---|---|
[C#/COMMON] 오일러의 체(Euler's Sieve)를 사용해 소수 구하기 (0) | 2018.12.09 |
[C#/COMMON] 에라토스테네스의 체(Sieve of Eratosthenes)를 사용해 소수 구하기 (0) | 2018.12.09 |
[C#/COMMON] TimeZoneInfo 클래스 : GetSystemTimeZones 정적 메소드를 사용해 표준 시간대 나열하기 (0) | 2018.12.08 |
[C#/COMMON] 스레드 안전 우선 순위 큐 사용하기 (0) | 2018.12.07 |
[C#/COMMON] 경로 결합하기 (0) | 2018.12.05 |
[C#/COMMON] 최대 공약수(GCD)/최소 공배수(LCM) 구하기 (0) | 2018.12.05 |
[C#/COMMON] 조합(Combination) 구하기 (0) | 2018.12.05 |
[C#/COMMON] 순열(Permutation) 구하기 (0) | 2018.12.04 |
[C#/COMMON] Thread 클래스 : 반복 작업자 사용하기 (0) | 2018.12.04 |
댓글을 달아 주세요