Ponieważ Invoke
/BeginInvoke
akceptuje Delegate
(zamiast wpisywanych delegata), musisz poinformować kompilator, jaki typ delegata do stworzenia; MethodInvoker
(2.0) lub Action
(3.5) są typowymi wyborami (zauważ, że mają ten sam podpis); tak:
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
Jeśli trzeba przejść w parametrach, a następnie „złapanych zmienne” są sposobem:
string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});
(uwaga: trzeba być nieco ostrożny w przypadku korzystania przechwytuje asynchroniczny , ale sync jest w porządku - czyli powyżej jest w porządku)
Innym rozwiązaniem jest napisać metodę rozszerzenia:
public static void Invoke(this Control control, Action action)
{
control.Invoke((Delegate)action);
}
następnie:
this.Invoke(delegate { this.Text = "hi"; });
// or since we are using C# 3.0
this.Invoke(() => { this.Text = "hi"; });
Można oczywiście zrobić to samo z BeginInvoke
:
public static void BeginInvoke(this Control control, Action action)
{
control.BeginInvoke((Delegate)action);
}
Jeśli nie można używać C# 3.0, można zrobić to samo ze zwykłym metody instancji , prawdopodobnie w klasie bazowej Form
.
Jak można przekazuję parametry do twojego pierwszego rozwiązania w tej odpowiedzi? Miałem na myśli to rozwiązanie: control.Invoke ((MethodInvoker) delegate {this.Text = "Hi";}); – uzay95
Dlaczego metoda Extension jest wywoływana bez konieczności jawnego przesyłania do działania? –
Ponieważ kompilator może wywnioskować, że z użycia. – RoboJ1M