BackKey не работает, когда поток работает. Зачем? - PullRequest
0 голосов
/ 04 января 2012

PageA Навигация на PageB Существует поток, запущенный для HttpWebRequest.Клавиша возврата недействительна, когда поток работает.Код страницы:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        Debug.WriteLine("OnNavigatedTo");
        //base.OnNavigatedTo(e);
        DoWork();
    }

void DoWork()
    {
        t = new Thread(new ThreadStart(() =>
        {
            request = WebRequest.Create("http://www.google.com") as HttpWebRequest;
            request.BeginGetResponse(new AsyncCallback(AsyncBack), request);
        }));
        t.IsBackground = true;
        t.Start();
    }


void AsyncBack(IAsyncResult ias)
    {
        HttpWebRequest req = (HttpWebRequest)ias.AsyncState;
        using (HttpWebResponse res = req.EndGetResponse(ias) as HttpWebResponse)
        {
            this.Dispatcher.BeginInvoke(() =>
            {
                this.PageTitle.Text = res.ContentLength.ToString();
                long length = res.ContentLength;
                for (long i = 0; i < length; i++)
                {
                    //here imitate a long time for working
                    Debug.WriteLine(i);
                    if (i == length)
                    {
                        break;
                    }
                }
                Debug.WriteLine(res.ContentLength);
            });
        }
    }

Клавиша возврата недействительна, пока не будет выполнен метод AsyncBack ().«Клавиша возврата недействительна» означает, что приложение не возвращается к PageA при нажатии клавиши «Назад» до тех пор, пока метод AsyncBack () не будет завершен.Зачем?Помогите мне?

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Почему, черт возьми, вы заключаете асинхронный запрос в пользовательский поток? Это даже не имеет смысла.

Опять же, ваш вопрос тоже не имеет особого смысла, но, скорее всего, ошибка связана с тем, что запрос пытается вызвать операцию через. диспетчер, на неправильной странице.

1 голос
/ 04 января 2012

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

    void DoWork()
    {
        HttpWebRequest request = WebRequest.Create("http://www.googl.com") as HttpWebRequest;
        request.BeginGetResponse(new AsyncCallback(AsyncBack), request);
    }

    void AsyncBack(IAsyncResult ias)
    {
        HttpWebRequest req = (HttpWebRequest)ias.AsyncState;
        using (HttpWebResponse res = req.EndGetResponse(ias) as HttpWebResponse)
        {
            this.Dispatcher.BeginInvoke(() =>
            {
                this.PageTitle.Text = res.ContentLength.ToString();
            });

            long length = res.ContentLength;
            for (long i = 0; i < length; i++)
            {
                long i_ = i;
                //here imitate a long time for working
                Thread.Sleep(10);
                this.Dispatcher.BeginInvoke(() =>
                {                        
                    this.PageTitle.Text = i_.ToString();
                });
                if (i == length)
                {
                    break;
                }
            }
            Debug.WriteLine(res.ContentLength);                
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...