【发布时间】:2010-08-11 18:19:42
【问题描述】:
假设我有一个类应该为我生成一些 ID(例如 GUID)。现在不幸的是,ID 生成是一个有点长的过程,如果我需要其中的一百个,我会遇到显着减速的问题。为了避免这些,我保留了一个预先生成的 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 还是...?
-
这是一个 WinForm。上面的代码是精简版,但它的工作方式完全相同,并且有相同的错误。
标签: c# multithreading backgroundworker