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
см. также это. 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