可以说我有一个类应该为我生成一些ID(例如GUID)。现在不幸的是,身份证生成是一个有点漫长的过程,如果我需要一百个身份证,那么我会遇到显着减速问题。为了避免这些情况,我保留了一个预生成ID的队列,当这个队列开始在它们上面运行时,我使用BackgroundWorker生成新的ID并将它们放入队列中。但是我遇到了一些问题。目前最大的一个是如何确保在队列完全耗尽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或...? – 2010-08-10 12:38:02
这是一个WinForm。上面的代码是精简版,但它的工作方式完全相同,并具有相同的错误。 – 2010-08-10 14:42:01