0

我有一个简单的 WPF 应用程序,我在其中使用线程。例如,在新线程中,我得到 DateTime,我想将它返回到主线程中的 TextBox。我读到这样做我必须使用 ControlDispatcher.Invoke 方法。但是有什么不对。。

namespace Bizantyjskie
{
    public static class ControlExtensions
    {

        public static void InvokeIfRequired(this Control control, Action action)
        {
            if (System.Threading.Thread.CurrentThread != control.Dispatcher.Thread)
                control.Dispatcher.Invoke(action);
            else
                action();
        }
        public static void InvokeIfRequired<T>(this Control control, Action<T> action, T parameter)
        {
            if (System.Threading.Thread.CurrentThread != control.Dispatcher.Thread)
                control.Dispatcher.Invoke(action, parameter);
            else
                action(parameter);
        }
    }

    class watki
    {
        public watki(MainWindow mw)
        {
            _mw = mw;
        }
        public MainWindow _mw;

        public void dzialaj()
        {
            Thread watek1 = new Thread(new ThreadStart(w1));
            watek1.Start();
        }

        private void w1()
        {

            string godz = DateTime.Now.TimeOfDay.ToString();
            ControlExtensions.InvokeIfRequired((value) => _mw.tb_w1.Text = value, godz);
        }
      }
     }

问题在于

ControlExtensions.InvokeIfRequired((value) => _mw.tb_w1.Text = value, godz);

我有一个错误。

无法将 lambda 表达式转换为类型“System.Windows.Controls.Control”,因为它不是委托类型

4

2 回答 2

3

您将扩展方法作为静态方法调用而忘记传递参数。将其更改为:

_mw.InvokeIfRequired(value => _mw.tb_w1.Text = value, godz);

或者,如果您仍想将其作为静态方法调用:

ControlExtensions.InvokeIfRequired(_mw, 
    value => _mw.tb_w1.Text = value, godz);
于 2013-01-02T16:13:31.843 回答
0

尝试这个

private void w1()
{
    string godz = DateTime.Now.TimeOfDay.ToString();
    ControlExtensions.InvokeIfRequired((value) => { _mw.tb_w1.Text = value; }, godz);
}

因为我认为您的“价值”成员是传递给委托的参数,但如果不查看签名我无法确定InvokeIfRequired- 如果object您不需要演员表?

例如

ControlExtensions.InvokeIfRequired((value) => { _mw.tb_w1.Text = (string)value; }, godz);

编辑:

抱歉,上面的签名都没看到!看起来您只是缺少 InvokeIfRequired 的通用参数:

ControlExtensions.InvokeIfRequired<string>((value) => { _mw.tb_w1.Text = value; }, godz);

那应该工作:)

另一种方法是调用非泛型方法并在委托范围内捕获字符串变量:

ControlExtensions.InvokeIfRequired(() => { _mw.tb_w1.Text = godz; });

我认为这有点清洁

于 2013-01-02T16:08:07.227 回答