Замораживание GUI при загрузке файла в потоке BackgroundWorker - PullRequest
0 голосов
/ 20 мая 2011

В теме BackgroundWorker (начинающейся с RunWorkerAsync()) я хочу загружать файлы с сервера через HttpWebRequest. Как только я звоню GetResponse(), графический интерфейс остается заблокированным, пока файл загружается с сервера. Это на самом деле не должно происходить, поскольку BackgroundWorker более или менее совпадает с потоком с некоторыми украшениями, такими как обработка прогресса и отмена. Кто-нибудь может объяснить мне, почему это происходит?

Вот фрагмент кода:

            if ((lRequest = (HttpWebRequest)WebRequest.Create(lURL)) != null)
            {
                if ((lResponse = lRequest.GetResponse()) != null)
                {
                    lRemoteStream = lResponse.GetResponseStream();
                    lLocalStream = File.Create(lTempFileName);

                    do
                    {
                        lBytesRead = lRemoteStream.Read(lTemp, 0, lTemp.Length);
                        lLocalStream.Write(lTemp, 0, lBytesRead);
                    } while (lBytesRead > 0);
                }
            }

Ответы [ 2 ]

1 голос
/ 20 мая 2011

Нужно увидеть больше кода, чтобы предложить помощь.

Одна из причин, по которой у меня возникла похожая проблема, была, когда я очень быстро отправлял значительный прогресс в пользовательский интерфейс, который по сути замораживал его. Поэтому, пока моя основная задача выполнялась в другом потоке, подобном вашему, мои обновления пользовательского интерфейса были очень быстрыми, что отрицательно сказалось на потоке пользовательского интерфейса. Может быть, вы делаете что-то подобное здесь?

0 голосов
/ 26 мая 2011

Тем временем я нашел проблему, и если я слушал вас, вы, вероятно, уже ответили на мой вопрос: /

если вы запускаете потоки BackgroundWorker, будьте осторожны, вы не обращаете внимание на основной поток пользовательского интерфейса. в моем случае я сделал это так:

    private void BW_FriendInRequest_DoWork(object sender, DoWorkEventArgs e)
    {
        while (true)
        {
            if (this.isLoggedIn)
                listIncomingRequests();

            Thread.Sleep(Config.mMessagesCheckSleep);
        }
    }


    private delegate void listIncomingRequestsDelegate();
    private void listIncomingRequests()
    {
        if (InvokeRequired)
        {
            listIncomingRequestsDelegate d = new listIncomingRequestsDelegate(listIncomingRequests);
            this.Invoke(d, new object[] { });
            return;
        }
       ...
    }

как только я удалил "InvokeRequired", эффект замораживания исчез.

...