Проблеми с Dispatcher.BeginInvoke

Получавам „Изисква се препратка към обект за нестатичното поле, метод или свойство „System.Windows.Threading.Dispatcher.BeginInvoke(System.Action)“ за този код.

private void ResponseCompleted(IAsyncResult result)
    {
        HttpWebRequest request = result.AsyncState as HttpWebRequest;
        HttpWebResponse response = request.EndGetResponse(result) as HttpWebResponse;

        using (StreamReader sr = new StreamReader(response.GetResponseStream()))
        {
            Dispatcher.BeginInvoke( () => {
                try
                {
                    XDocument resultsXml = XDocument.Load(sr);
                    QueryCompleted(new QueryCompletedEventArgs(resultsXml));
                }
                catch (XmlException e)
                {
                    XDocument errorXml = new XDocument(new XElement("error", e.Message));
                    QueryCompleted(new QueryCompletedEventArgs(errorXml));
                }
            });

        }
    }
}

person cmaduro    schedule 08.04.2010    source източник
comment
В нишката на потребителския интерфейс създайте диспечер -- Dispatcher UIDispatcher = Dispatcher.CurrentDispatcher; -- След това в горния метод извикайте BeginInvoke по този начин -- UIDispatcher.BeginInvoke(()=›... --   -  person Amsakanna    schedule 08.04.2010
comment
вижте и този.. forums.create.msdn.com/forums/ p/89243/534524.aspx   -  person Shashi    schedule 07.10.2011


Отговори (2)


Грешката показва, че имате нужда от екземпляр на Dispatcher, за да извикате BeginInvoke, тъй като това е метод на екземпляр. Къде ще получите този екземпляр зависи от това къде искате да изпратите повикване.

Може би можете да опитате да използвате статичното свойство Dispatcher.CurrentDispatcher, за да получите екземпляра на диспечера за текущата нишка и след това да извикате BeginInvoke на този екземпляр. Или това, или по някакъв начин вземете екземпляр на диспечер към вашия метод от конкретната нишка, към която искате да се обадите.

person Zach Johnson    schedule 08.04.2010
comment
Като се има предвид, че това е асинхронно обратно извикване и ако приемем, че той действително иска да изпълнява извикания код в нишката на потребителския интерфейс, Dispatcher.CurrentDispatcher всъщност няма да направи това, от което се нуждае. Но си прав при други обстоятелства (или ако съм сгрешил за изискванията му). - person itowlson; 08.04.2010
comment
Защото, ако това е асинхронно обратно извикване, то се изпълнява в нишка от пул от нишки, а не в нишката на потребителския интерфейс. Така Dispatcher.CurrentDispatcher ще създаде нов Dispatcher за извикващата нишка, т.е. нишката на пула от нишки. И така извиканият код ще се изпълнява в тази новосъздадена нишка на Dispatcher, т.е. извикващата нишка, т.е. нишката на пула от нишки -- не нишката на потребителския интерфейс. (Разбира се, моите предположения може да са грешни тук.) - person itowlson; 08.04.2010
comment
Всъщност накрая поех по различен път. Използвах AsyncOperation/AsyncOperationManager, за да задействам събитието QueryCompleted в нишката на потребителския интерфейс. По този начин нямам нужда от грозния диспечерски код в моите чисти изгледи. - person cmaduro; 09.04.2010
comment
Ако искате да използвате Dispatcher.CurrentDispatcher, трябва да вземете негово копие от нишката на потребителския интерфейс и да го съхраните (например във Form_Load), след което можете да извикате тази съхранена версия на свойството от вашите фонови работни нишки. -- Ако трябваше да вземете Dispatacher.CurrentDispatcher директно от фоновите нишки, той ще върне диспечера за тази фонова нишка, което би било безполезно, тъй като вече сте в този контекст. - person BrainSlugs83; 28.08.2013

Нещата се промениха малко след публикуването на последния отговор за този въпрос. System.Windows.Threading.Dispatcher.BeginInvoke вече е Deployment.Current.Dispatcher.BeginInvoke

person Abhishek Oza    schedule 25.01.2012
comment
Можете ли да уточните какво имате предвид с това? Нищо в .NET 4.0 не се е променило в това отношение. Имахте предвид, че е променено в .NET 4.5? - person BrainSlugs83; 28.08.2013
comment
Внедряване: е в Silverlight - person raidsan; 24.12.2013