나를 위해 일부 ID (예 : GUID)를 생성해야하는 클래스가 있다고 가정 해 보겠습니다. 불행히도 신분증 생성은 다소 긴 과정이며 만약 내가 100 명이 필요하다면 상당한 속도 저하의 문제가 발생합니다. 이를 방지하기 위해 미리 생성 된 ID 큐를 유지하고이 큐가 실행되기 시작하면 BackgroundWorker를 사용하여 새 큐를 생성하고 큐에 배치합니다. 하지만 내가 겪은 몇 가지 문제가 있습니다. 현재 가장 큰 방법은 대기열에 ID가 모두있는 경우 주 스레드가 BackroundWorker가 생성하여 대기열에 넣을 때까지 대기하는 방법입니다. 내가 가지고있는 코드를 보여줍니다.백그라운드 작업자 동기화
public class IdGenerator
{
private Queue<string> mIds = new Queue<string>();
private BackgroundWorker mWorker = new BackgroundWorker();
private static EventWaitHandle mWaitHandle = new AutoResetEvent(false);
public IdGenerator()
{
GenerateIds();
this.mWorker.DoWork += new DoWorkEventHandler(FillQueueWithIds);
}
private void GenerateIds()
{
List<string> ids = new List<string>();
for (int i = 0; i < 100; i++)
{
ids.Add(Guid.NewGuid().ToString());
}
lock (this.mIds)
{
foreach (string id in ids)
{
this.mIds.Enqueue(id);
}
}
}
public string GetId()
{
string id = string.Empty;
lock (this.mIds)
{
if (this.mIds.Count > 0)
{
id = this.mIds.Dequeue();
}
if (this.mIds.Count < 100)
{
if (!this.mWorker.IsBusy)
{
this.mWorker.RunWorkerAsync();
}
}
}
if (this.mIds.Count < 1)
{
mWaitHandle.WaitOne();
}
return id;
}
void FillQueueWithIds(object sender, DoWorkEventArgs e)
{
GenerateIds();
mWaitHandle.Set();
}
}
분명히 올바르게 작동하지 않습니다. 그것은 WaitOne 및 Set 메서드를 호출하는 적절한 타이밍 문제가있는 것 같습니다. 그리고 때로는 작업자가 이미 작업을 완료 했음에도 IsBusy 속성은 true를 반환합니다.
편집 :
그것의 WinForm과 내가 .NET 2.0
이것은 실물의 실물 크기 인 것처럼 보입니다.이 코드에서도 오류가 발생합니까? 그것은 WinForms 또는 WPF 또는 ...인가요? –
그것은 WinForm입니다. 위의 코드는 제거 된 버전이지만 완전히 똑같은 방식으로 작동하고 동일한 오류가 발생합니다. –