2010-06-24 7 views
5

Alternative Frage: Warum ist VS10 so begeistert, sich über Invoke zu beschweren?Welche C# -Assembly enthält Invoke?

In meinen fortwährenden Streben nach meine app Arbeit macht die weltbesten Programmierer C# wird, habe ich beschlossen, dass Threads ™ eine gute Sache ist.

MSDN hat einen hilfreichen Artikel zur Herstellung thread-safe calls to controls, aber es (und scheinbar jeder andere Artikel zu diesem Thema) verweist schräg auf eine Methode namens Invoke. Manchmal sogar BeginInvoke, welches I've read is to be preferred.

All dies wäre toll, wenn ich Visual Studio Invoke aufrufen könnte. MSDN sagt, dass it is contained in the System.Windows.Forms assembly, aber ich benutze das bereits. Um sicher zu sein, habe ich auch versucht, System.Threading, aber ohne Erfolg.

Welche Reifen muss ich durchspringen, um Aufruffunktion zu erhalten?

+0

Was meinen Sie mit "Visual Studio Recognize Invoke"? Intellisense? –

+0

Sprechen Sie über das Aufrufen einer Methode für ein Steuerelement, das in einem anderen Thread als dem aktuell ausgeführten Thread erstellt wurde? –

+1

+1 für Humor ... –

Antwort

4

Invoke ist innerhalb der Kontrolle. I.e.

Es gibt keine Möglichkeit, Invoke direkt aufzurufen, da es in System.Windows.Forms keine solche Methode gibt. Die Invoke-Methode ist ein Kontrollmitglied.

Hier ist ein example ich früher gemacht:

public delegate void AddListViewItemCallBack(ListView control, ListViewItem item); 
public static void AddListViewItem(ListView control, ListViewItem item) 
{ 
    if (control.InvokeRequired) 
    { 
     AddListViewItemCallBack d = new AddListViewItemCallBack(AddListViewItem); 
     control.Invoke(d, new object[] { control, item }); 
    } 
    else 
    { 
     control.Items.Add(item); 
    } 
} 
2

Sie benötigen Invoke auf einer Instanz von etwas zu nennen, die es enthält, - wenn Sie Windows Forms verwenden, das wäre eine Kontrolle sein:

control.Invoke(someDelegate); 

oder für Code innerhalb eines Formulars, können Sie verwenden Sie die implizite this Referenz:

Invoke(someDelegate); 

Sie sollten nicht durch irgendwelche speziellen Reifen gehen müssen. Wenn sich Visual Studio beschwert, geben Sie bitte den Compiler-Fehler und den Code an, über den sich der Benutzer beschweren möchte. Es gibt nichts besonderes an Invoke hier.

2

Die Winform Invoke ist eine Instanzmethode von Control - Sie benötigen nur eine Instanz eines Steuerelements (das in vielen Fällen this sein kann). Zum Beispiel:

txtBox.Invoke(...); 

Es kann auch über eine Schnittstelle, oder Sync-Kontext zugegriffen werden, wenn Sie Abstraktion wollen - aber der einfachste Ansatz ist es an der Benutzeroberfläche über ein Ereignis zu behandeln, wobei in diesem Fall Bedienelemente sind bequem verfügbar .

0

Invoke ist eine Methode für Objekte, die normalerweise in den Steuerelementen in der Forms-Bibliothek und einigen asynchronen Klassen gefunden wird. Sie benötigen natürlich bestimmte Objekte, um Invoke unter , control/class aufrufen zu können.

1

Wenn Sie wirklich die weltbeste C# Programmierer werden wollen Sie lernen müssen, dass Threads nicht eine gute Sache, wenn nicht richtig eingesetzt.

Aktualisieren der Benutzeroberfläche über Threads ist in der Regel ein Zeichen dafür, dass Sie Threads missbrauchen.

Wie auch immer, es ist nicht genug zu verwenden using System.Windows.Forms, Sie müssen es zu den Referenzen hinzufügen. Machen Sie einen Rechtsklick auf References in Ihrem Projekt-Explorer, dann Referenzen hinzufügen und wählen System.Windows.Forms

+0

Vielen Dank! Du bist weggegangen und hast mich verwirrt gemacht. (Hier ist eine andere Frage, die Sie vielleicht beantworten möchten: http://stackoverflow.com/questions/3110154/why-is-the-explicit-management-of-threads-a-badthing) –

+0

"Aktualisierung der Benutzeroberfläche über Threads ist normalerweise ein Zeichen, dass du Threads missbrauchst. " Wow, das ist neu für mich. Wenn ich also eine lange Analyseoperation in einen BG-Thread einfüge, um die Benutzeroberfläche ansprechbar zu halten, aber der Benutzer möchte die inkrementellen Ergebnisse schnell sehen, sodass mein BG-Thread regelmäßig Ergebnisse an den UI-Thread zurücksendet, das ist Missbrauch? Und Sie werden jetzt die bessere Lösung aufdecken? –

+2

Ja, es ist ganz einfach: Verwenden Sie Ereignisse. Der BG-Thread stellt ein Ereignis zur Verfügung, zu dem die Benutzeroberfläche abonnieren kann, zB "FileCopied", "NumberCalculated" usw. Die UI kann sie abonnieren und der Hintergrund-Worker würde immer noch ohne Änderungen funktionieren, wenn Sie Ihren Code von Winforms zu WPF, implementieren mehrsprachige Benutzeroberfläche, ändern Sie einen langweiligen Dialog in einen ausgefallenen Dialog usw. – dbemerlin

0

Sie sind vermutlich Invoke aus innerhalb einer Klasse zu nennen versuchen, (das heißt nicht von innerhalb einer Form oder Control). Verschieben Sie Ihren Code aus der Klasse und in ein Formular oder Steuerelement, und Sie werden sehen, dass Invoke kompiliert und ordnungsgemäß funktioniert (streng genommen sollte Ihr Code this.Invoke referenzieren, was die Quelle der Methode klar macht, aber Invoke wird auch seit dem funktionieren es übernimmt die this).