可以說我有一個類應該爲我生成一些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