为什么我的下载队列在彼此之后更快地调用时会中断?

时间:2014-11-24 15:14:04

标签: c# unity3d webclient

我正在使用以下脚本从外部站点下载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;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

队列不是设计为从多个线程访问的,当你这样做时,任何数量的东西都可能出错。您应该使用ConcurrentQueueBlockingCollection(使用ConcurrentQueue),因为它专门设计用于多个线程。