2010-04-08 2 views
11

Я получаю «Ссылка на объект для нестатического поля, метода или свойства« System.Windows.Threading.Dispatcher.BeginInvoke (System.Action) »для этого кода.Dispatcher.BeginInvoke problems

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)); 
       } 
      }); 

     } 
    } 
} 
+0

В потоке пользовательского интерфейса создайте диспетчер - Диспетчер UIDispatcher = Dispatcher.CurrentDispatcher; - Тогда в приведенном выше методе вызов BeginInvoke как это - UIDispatcher.BeginInvoke (() => ... - – Amsakanna

+0

см. Этот тоже .. http://forums.create.msdn.com/forums/p/89243 /534524.aspx – Mahantesh

ответ

16

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

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

+0

Учитывая, что это асинхронный обратный вызов и предполагается, что он действительно хочет запустить вызываемый код в потоке пользовательского интерфейса, Dispatcher.CurrentDispatcher фактически не будет делать то, что ему нужно. Но вы правы при других обстоятельствах (или если я неправильно понял его требования). – itowlson

+0

@itowlson: почему это не работает? – Amsakanna

+2

Потому что если это асинхронный обратный вызов, он работает в потоке пула потоков, а не в потоке пользовательского интерфейса. Таким образом Dispatcher.CurrentDispatcher создаст новый диспетчер для вызывающего потока, т. е. поток пула потоков. И поэтому вызываемый код будет запускаться на этом вновь созданном потоке Диспетчера, то есть на вызывающий поток, то есть на поток пула потоков, а не на поток пользовательского интерфейса. (Конечно, мой предположения могут быть ошибочными здесь.) – itowlson

21

Немного изменилось со времени последнего ответа на этот вопрос. System.Windows.Threading.Dispatcher.BeginInvoke сейчас Deployment.Current.Dispatcher.BeginInvoke

+0

Можете ли вы указать, что вы подразумеваете под этим? Ничто в .NET 4.0 не изменилось в этом отношении. Вы имели в виду, что он изменился в .NET 4.5? – BrainSlugs83

+1

Очень полезно, спасибо. –

+0

Развертывание: находится в Silverlight – raidsan

Смежные вопросы