如何在WPF中使用InvokeRequired?

时间:2015-07-01 15:37:40

标签: wpf c#-4.0

我正在使用WPF(c#)应用程序,需要在某些过程中使用线程。但“InvokeRequired”不起作用。 我看这个answer但我无法工作。

这是我的代码:

private void CambiarProgreso(string texto, int valor)
    {
        if (this.InvokeRequired) //preguntamos si la llamada se hace desde un hilo 
        {
            //si es así entonces volvemos a llamar a CambiarProgreso pero esta vez a través del delegado 
            //instanciamos el delegado indicandole el método que va a ejecutar 
            CambiarProgresoDelegado delegado = new CambiarProgresoDelegado(CambiarProgreso);
            //ya que el delegado invocará a CambiarProgreso debemos indicarle los parámetros 
            object[] parametros = new object[] { texto, valor };
            //invocamos el método a través del mismo contexto del formulario (this) y enviamos los parámetros 
            this.Invoke(delegado, parametros);
        }
        else
        {
            //en caso contrario, se realiza el llamado a los controles 
            lblProgreso.Content = texto;
            PrbProgreso.Value = valor;
        }
    }

  delegate void CambiarProgresoDelegado(string texto, int valor);

非常感谢!

1 个答案:

答案 0 :(得分:1)

这解决了我的问题。 感谢。

private void CambiarProgreso(string texto, int valor)
        {
            if (!this.Dispatcher.CheckAccess()) //preguntamos si la llamada se hace desde un hilo 
            {
                //si es así entonces volvemos a llamar a CambiarProgreso pero esta vez a través del delegado 
                //instanciamos el delegado indicandole el método que va a ejecutar 
                //CambiarProgresoDelegado delegado = new CambiarProgresoDelegado(CambiarProgreso);
                //ya que el delegado invocará a CambiarProgreso debemos indicarle los parámetros 
                object[] parametros = new object[] { texto, valor };
                //invocamos el método a través del mismo contexto del formulario (this) y enviamos los parámetros 
                this.Dispatcher.Invoke(new CambiarProgresoDelegado(CambiarProgreso), parametros);
            }
            else
            {
                //en caso contrario, se realiza el llamado a los controles 
                lblProgreso.Content = texto;
                PrbProgreso.Value = valor;
            }
        }