Допустим, у меня есть класс, который должен сгенерировать какой-то идентификатор (например, GUID) для меня.Сейчас, к сожалению, генерация идентификатора - это довольно долгий процесс, и если мне понадобится сотня из них, я столкнусь с проблемой значительного замедления.Чтобы избежать этого, я сохраняю очередь предварительно сгенерированного идентификатора, и когда эта очередь начинает исчерпывать их, я использую BackgroundWorker, чтобы генерировать новые и помещать их в очередь.Но есть некоторые проблемы, с которыми я столкнулся.Самый большой на данный момент - как убедиться, что в случае полного исчерпания очереди по идентификаторам основной поток ожидает, когда 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