2

ゲッターをスレッドセーフにしたいと思います。これを行うと、エラーが発生します。

public ApplicationViewModel SelectedApplication
    {
        get
        {
            if (InvokeRequired)
            {
                BeginInvoke((Action<ApplicationViewModel>)SelectedApplication);
            }

            return _applicationsCombobox.SelectedItem as ApplicationViewModel;
        }
    }

エラーがあります:

Cannot cast expression of type 'Foo.Model.ApplicationViewModel' to type 'Action<ApplicationViewModel>'
4

3 に答える 3

6

多くのことが間違っています:

  • BeginInvoke は使用できません。Invoke必須です
  • Action<> は使用できません。値を返すため、Func<>必須です
  • 呼び出し後に元のコードを実行することもできませんelse

生成するもの:

public ApplicationViewModel SelectedApplication
{
    get
    {
        if (this.InvokeRequired)
            return (ApplicationViewModel)this.Invoke(new Func<ApplicationViewModel>(() => this.SelectedApplication));
        else
            return _applicationsCombobox.SelectedItem as ApplicationViewModel;
    }
}

低レベルのプロパティでスレッド コンテキスト スイッチを非表示にすることは、通常は間違いです。呼び出しには多くのオーバーヘッドがあり、結果として得られるコードは、なぜそれほど遅いのかについての十分なヒントがなければ、非常に遅くなる可能性があります。

于 2011-08-04T17:17:22.147 に答える
3

BeginInvokeデリゲートを取ります。

あなたは書ける

return (ApplicationViewModel)Invoke(new Func<object>(() => applicationsCombobox.SelectedItem));
于 2011-08-04T17:12:59.767 に答える