我正在使用以下脚本从外部站点下载XML文件,但是当相互快速调用该函数时(快速切换要显示的表),队列似乎会滑落。
当以正常方式调用该函数时,它工作得很好,但是当用户开始以更快的速度在表之间切换时,数据不会加载。除了在极少数情况下它会说队列很忙,它不会给出任何例外。所有艰难的我似乎无法找到导致这个队列滑落的原因。
public void PreObtainData(ref MonavisaRequestForm request, string dateAndTime, string fileDateAndTime)
{
if (!initialized)
initialize();
try
{
if (!request.webclient.IsBusy && requestQueue.Count == 0)
{
request.url = request.url.Replace("&", "%26");
request.url = request.url.Replace("+", "%2B");
Uri uri = new Uri(string.Format("http://localhost/login.php?username={0}&password={1}&request={2}", request.username, request.password, request.url));
request.webclient.DownloadFile(uri, @"Nioo Graph Data " + fileDateAndTime + ".xml");
}
else if (!request.webclient.IsBusy && requestQueue.Count > 0)
{
Uri uri = new Uri(string.Format("http://localhost/login.php?username={0}&password={1}&request={2}", requestQueue.Peek().username, requestQueue.Peek().password, requestQueue.Peek().url));
requestQueue.Peek().webclient.DownloadStringAsync(uri);
requestQueue.Dequeue();
}
else
{
requestQueue.Enqueue(request);
}
}
catch (System.Net.WebException ex)
{
//if (ex.Status != System.Net.WebExceptionStatus.ProtocolError)
{
throw ex;
}
}
}
答案 0 :(得分:2)
队列不是设计为从多个线程访问的,当你这样做时,任何数量的东西都可能出错。您应该使用ConcurrentQueue
或BlockingCollection
(使用ConcurrentQueue
),因为它专门设计用于多个线程。