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

エラーが発生しました。

デリゲート型ではないため、ラムダ式を型'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);
}

'value'メンバーはデリゲートに渡されるパラメーターだと思いますが、の署名を見ないとわかりませんが、キャストが必要ない場合は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 に答える