は、.NET 2.0を使用しているので、あなたはあなたに利用できるFunc
デリゲートを持っていませんが、あなたはMethodInvokerデリゲートを使用することができます:ここに は、いくつかのより多くの読書です。
.NET 2.0でラムダ式構文を使用することはできませんが、以下のコード例に示すように、「匿名の代理人」構文(ほとんど同じことです)を使用できます。
UI以外のスレッドからUIコントロールのデータを照会するのは一般的ではありません。通常、UIコントロールはUIスレッドで実行されるイベントをトリガするので、必要なデータをUIコントロールから収集し、そのデータを他の関数に渡すので、Invokeを心配する必要はありません。
public ApplicationViewModel SelectedApplication
{
get
{
if (this.InvokeRequired)
{
ApplicationViewModel value = null; // compiler requires that we initialize this variable
// the call to Invoke will block until the anonymous delegate has finished executing.
this.Invoke((MethodInvoker)delegate
{
// anonymous delegate executing on UI thread due calling the Invoke method
// assign the result to the value variable so that we can return it.
value = _applicationsCombobox.SelectedItem as ApplicationViewModel;
});
return value;
}
else
{
return _applicationsCombobox.SelectedItem as ApplicationViewModel;
}
}
}
EDIT:あなたのケースでは
は、しかし、あなたはこのような何かを行うことができるはず今、私はあなたの.NET 4.0のコードサンプルを見ても、起動機能を見ていることを、私は見それがどのように価値を返すことができるか(私が前に使用する理由はなかった)。
まあ、MethodInvokerデリゲートは戻り値を期待していませんが、@ haiyyuが指摘したように、独自のデリゲートを定義することができます。たとえば、あなたは自分自身のFunc<TResult>
デリゲートを定義する必要があるだろう、と元のコードは、おそらく正常に動作します:MSDNのページから
// this is all that is required to declare your own Func<TResult> delegate.
delegate TResult Func<TResult>();
サンプルコード:
public partial class Form1 : Form
{
public Form1()
{
// Create a timer that will call the ShowTime method every second.
var timer = new System.Threading.Timer(ShowTime, null, 0, 1000);
}
private void ShowTime(object x)
{
// Don't do anything if the form's handle hasn't been created
// or the form has been disposed.
if (!this.IsHandleCreated && !this.IsDisposed) return;
// Invoke an anonymous method on the thread of the form.
this.Invoke((MethodInvoker) delegate
{
// Show the current time in the form's title bar.
this.Text = DateTime.Now.ToLongTimeString();
});
}
}
を独自のデリゲートを作成することができます。 – haiyyu