Dispatcher.BeginInvoke问题

cma*_*uro 11 c# dispatcher

我得到"此代码的非静态字段,方法或属性'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));
                }
            });

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Abh*_*Oza 21

自从针对这个问题发布了最后一个答案后,情况发生了一些变化. System.Windows.Threading.Dispatcher.BeginInvoke就是现在Deployment.Current.Dispatcher.BeginInvoke


Zac*_*son 18

该错误表示您需要一个Dispatcher要调用的实例,BeginInvoke因为它是一个实例方法.获得该实例的位置取决于您要拨打电话的位置.

也许您可以尝试使用static属性Dispatcher.CurrentDispatcher来获取当前线程的调度程序实例,然后调用BeginInvoke该实例.从您要调用的特定线程获取或以某种方式从您的方法获取调度程序实例.

  • 因为如果这是异步回调,它将在线程池线程上运行,而不是在UI线程上运行.所以Dispatcher.CurrentDispatcher将为调用线程创建一个新的Dispatcher,即线程池线程.因此,调用的代码将在新创建的Dispatcher的线程上运行,即调用线程,即线程池线程 - 而不是UI线程.(当然,我的假设在这里可能是错误的.) (3认同)
  • 如果要使用Dispatcher.CurrentDispatcher,则必须从UI线程获取它的副本并将其存储(例如,在Form_Load上),然后您可以从后台工作线程调用该存储的属性版本. - 如果您直接从后台线程中获取Dispatacher.CurrentDispatcher,它将返回该后台线程的调度程序,这将是无用的,因为您已经在该上下文中. (2认同)