C# Probeleme mit der "using-Direktive"; speziell die Klasse "Dispatcher"

T

Tersus

Gast
Guten Abend,
ich verwende MSVS2012.

Ich benötige die Klasse "Dispatcher".

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Threads.Resources;

using System.Windows.Threading;

namespace Threads
{
    class Class1
    {
        public Class1()
        {
            Dispatcher.BeginInvoke(() => ausgabe()); // Fehler: Methode nicht definiert ...
        }

        private String ausgabe()
        {
            return " ";
        }
    }
}

Die Klasse hat nur zwei Methoden bei mir. Was mache ich falsch?
 
Zuletzt bearbeitet von einem Moderator: (Copy/Paste Fehler beseitigt: BeginIvoke() -> BeginInvoke())
Code:
Dispatcher.BeginIvoke(() => ausgabe());

Was soll das tun? So ist es, soweit ich sagen kann, komplett falsch. Der Operator '=>' gehört da überhaupt nicht hin, die leeren Klammern () davor auch nicht.
 
andy_0 schrieb:
Code:
Dispatcher.BeginIvoke(() => ausgabe());

Was soll das tun? So ist es, soweit ich sagen kann, komplett falsch. Der Operator '=>' gehört da überhaupt nicht hin, die leeren Klammern () davor auch nicht.

1.
Das ist ein Lambda-Operator und der Ausdruck ist so absolut richtig. Heißt nichts anderes als, dass der Methode BeginIvoke() eine anonyme delegate Methode übergeben wird, die weder Übergabeparameter noch Rückgabewert hat aber den Inhalt ausgabe() besitzt.
Das ist halt "fortgeschrittener" Programmierstil ... :evillol:

2.
Um die Übergabeparameter der Methode BeginIvoke() geht es hier aber gar nicht, sondern um die leidliche Tatsache, dass diese Methode bei mir nicht vorhanden ist. Der Dispatcher besitzt bei mir nur zwei Vergleichs-Methoden.

EDIT:

Thema bitte schließen! Da ich möglichst schnell Hilfe benötige, habe ich selbiges Thema in einem anderen Forum, welches sich direkt nur mit C# beschäftigt, eröffnet! Crossposting ist bekanntlich unerwünscht, daher bitte ich um Schließung dieses Themas!

Hier geht es weiter:

http://www.mycsharp.de/wbb2/thread.php?threadid=107916
 
Zuletzt bearbeitet von einem Moderator:
Ich habe in dem andern Forum keinen Account, von daher musst du wohl hier lesen.
Wo soll denn dein Dispatcher herkommen? ;) Du leitest nicht von Window ab, hast also auch kein Dispatcher-Property. Demnach versuchst du, zumindest, dein Code tut es, eine Klassen-Methode statisch aufzurufen.

Code:
Dispatcher dispatcher = Dispatcher.CurrentDispatcher;
dispatcher.BeginInvoke( () => FooBar() );

So sollte es gehen.
 
holy schrieb:
Ich habe in dem andern Forum keinen Account, von daher musst du wohl hier lesen.
Wo soll denn dein Dispatcher herkommen? ;) Du leitest nicht von Window ab, hast also auch kein Dispatcher-Property. Demnach versuchst du, zumindest, dein Code tut es, eine Klassen-Methode statisch aufzurufen.

Code:
Dispatcher dispatcher = Dispatcher.CurrentDispatcher;
dispatcher.BeginInvoke( () => FooBar() );

So sollte es gehen.

1.
Die Methode BeginInvoke() der Klasse Dispatcher ist eine statische! D.h. ich benötige keine Instanz der Klasse, bzw. würde ich durch eine eventuelle Instanz sowieso nicht auf diese Methode zugreifen können.

2.
Die Instanziierung eines Objektes der Klasse Dispatcher geschieht in Deinem Beispiel durch die Initialisierung der Variable "dispatcher" vom Typ Dispatcher, indem ihr das statische Mitglied CurrentDispatcher derselbigen Klasse zugewiesen wird.
Das geht bei mir gar nicht, weil meine Klasse Dispatcher, wie schon mehrfach erwähnt, nichts -- auch keine statischen Mitglieder -- außer die beiden Vergleichs-Methoden Equals und ReferenceEquals besitzt. Und genau das ist das Problem.

Meine Klasse Dispatcher hat nicht die Methoden, die sie haben sollte!

EDIT:

Korrektur zu 1.
Die überladene Methode BeginInvoke(Action) ist static und genau diese Methode will ich ja auch verwenden.
Die Methode BeginInvoke(Delegate, Object[]) ist nicht static, wird von mir aber auch hier nicht benötigt!
 
Zuletzt bearbeitet von einem Moderator:
In deinem Code im ersten Post steht "BeginI_voke" aber das ist vermutlich nur ein Copy&Paste-Fehler?
 
Die BeginInvoke()-Methode erwartet einen Delegate, du übergibst aber eine (Lamba-)Expression.

Wenn du aus der Expression einen Delegate machst funktioniert das auch:
Code:
Dispatcher.BeginInvoke(new Action( () => ausgabe() ));

oder in diesem Fall noch kürzer:
Code:
Dispatcher.BeginInvoke(new Action(ausgabe));
 
Darlis schrieb:
In deinem Code im ersten Post steht "BeginI_voke" aber das ist vermutlich nur ein Copy&Paste-Fehler?

Hattest Recht, ich habe es korrigiert.

TheCadillacMan schrieb:
Die BeginInvoke()-Methode erwartet einen Delegate, du übergibst aber eine (Lamba-)Expression.

Wenn du aus der Expression einen Delegate machst funktioniert das auch:
Code:
Dispatcher.BeginInvoke(new Action( () => ausgabe() ));

oder in diesem Fall noch kürzer:
Code:
Dispatcher.BeginInvoke(new Action(ausgabe));

Ja, die Methode BeginInvoke() erwartet einen Delegaten und der Lambda-Ausdruck () => ausgabe() ist ein (anonymer) Delegator! Daran scheitert es also nicht.
Deine Beispiele funktionieren bei mir nämlich auch nicht.

Ihr überlest leider noch immer, WO GENAU mein Problem liegt.

Mein Problem ist NICHT die Parameterübergabe, sondern das Faktum, dass der Klasse Dispatcher bis auf die Methoden Equals und ReferenceEquals alles andere Fehlt. D.h. meine IDE meckert, dass es keine BeginInvoke() Methode gibt!
 
Tersus schrieb:
1.
Die Methode BeginInvoke() der Klasse Dispatcher ist eine statische! D.h. ich benötige keine Instanz der Klasse, bzw. würde ich durch eine eventuelle Instanz sowieso nicht auf diese Methode zugreifen können.

2.
Die Instanziierung eines Objektes der Klasse Dispatcher geschieht in Deinem Beispiel durch die Initialisierung der Variable "dispatcher" vom Typ Dispatcher, indem ihr das statische Mitglied CurrentDispatcher derselbigen Klasse zugewiesen wird.
Das geht bei mir gar nicht, weil meine Klasse Dispatcher, wie schon mehrfach erwähnt, nichts -- auch keine statischen Mitglieder -- außer die beiden Vergleichs-Methoden Equals und ReferenceEquals besitzt. Und genau das ist das Problem.

Meine Klasse Dispatcher hat nicht die Methoden, die sie haben sollte!

EDIT:

Korrektur zu 1.
Die überladene Methode BeginInvoke(Action) ist static und genau diese Methode will ich ja auch verwenden.
Die Methode BeginInvoke(Delegate, Object[]) ist nicht static, wird von mir aber auch hier nicht benötigt!

Zu 1.:
Sie ist garantiert nicht statisch. Was du meinst ist die DispatcherExtension. Um die zu benutzen, brauchst du eine Referenz auf System.Windows.Presentation.dll (Die Extension-Methode funktioniert genauso,wie der Code, den ich dir schon gepostet habe). Der "normale" Dispatcher liegt in WindowsBase.dll. Schau bitte nach, ob du wenigstens letzteres in deinen Referenzen hast.

Zu 2.:
Siehe oben. Ist WindowsBase.dll referenziert?

WPF? Silverlight? WinRT?
Target-Framework?
Ergänzung ()

Nachtrag:
Ich bin auch noch so deppert und versuche dir zu helfen und lese dabei den anderen Thread mit.
Beim nächsten mal stellst du dich etwas weniger "fortgeschritten" an und beschreibst dein Problem erstmal korrekt.

Für Windows Phone sieht das ganze so aus:

Code:
Dispatcher dispatcher = System.Windows.Deployment.Current.Dispatcher;

Viel Spaß damit.
 
@holy

Erstmal: Riesigen Dank!

Weißt Du, ich habe sehr oft versucht zu erläutern, dass ich kein Problem mit den Übergabeparametern habe oder die Klasse falsch einsetzte. Ich habe mehrmals darauf hingewiesen, dass das Problem wo anders liegen muss, da, wie gesagt, meine Klasse Dispatcher nicht so ausgestattet ist, wie sie es sein sollte.

Ich ahnte ja, dass es ein Referenzproblem ist, bwz. ein Fehler in der using-direktive vorliegen muss aber irgendwie hat jeder versucht, meinen Quelltext auszubessern ...

Zum Thema "fortgeschritten" schrieb ich eben dieses Wort in Anführungszeichen und hintersetzte einen Smilie. War mehr sarkastisch und ironisch gemeint, als weniger ernst.

Code:
Dispatcher dispatcher = System.Windows.Deployment.Current.Dispatcher;

Kann man das mit einer using-Direktive abkürzen?
 
Tersus schrieb:
@holy

Erstmal: Riesigen Dank!

Weißt Du, ich habe sehr oft versucht zu erläutern, dass ich kein Problem mit den Übergabeparametern habe oder die Klasse falsch einsetzte. Ich habe mehrmals darauf hingewiesen, dass das Problem wo anders liegen muss, da, wie gesagt, meine Klasse Dispatcher nicht so ausgestattet ist, wie sie es sein sollte.

Ich ahnte ja, dass es ein Referenzproblem ist, bwz. ein Fehler in der using-direktive vorliegen muss aber irgendwie hat jeder versucht, meinen Quelltext auszubessern ...

Zum Thema "fortgeschritten" schrieb ich eben dieses Wort in Anführungszeichen und hintersetzte einen Smilie. War mehr sarkastisch und ironisch gemeint, als weniger ernst.

Code:
Dispatcher dispatcher = System.Windows.Deployment.Current.Dispatcher;

Kann man das mit einer using-Direktive abkürzen?

Keine Ursache. Aber tue dir selber ein Gefallen und schreib in Zukunft direkt für was du entwickelst. Wenn man sich solche Infos aus Screenshots fischen muss, passiert nun mal sowas wie Rumraten ;)

Der Namespace für die Using-Direktive ist, hoffentlich offensichtlich, System.Windows ;)
 
Ich meinte, wie kann ich dafür sorgen, dass ich die korrekt referenzierte Dispatcher Klasse erhalte und einfach Dispatcher schreiben kann, anstatt System.Windows.Deployment.Current.Dispatcher schreiben zu müssen.

Übrigens funktioniert System.Windows.Deployment.Current.Dispatcher.BeginInvoke( () => foo() ) auch ohne Instanziierung. ;)
 
Tersus schrieb:
Ich meinte, wie kann ich dafür sorgen, dass ich die korrekt referenzierte Dispatcher Klasse erhalte und einfach Dispatcher schreiben kann, anstatt System.Windows.Deployment.Current.Dispatcher schreiben zu müssen.

Für WP musst du, soweit ich weiß, immer den Umweg über das Deployment gehen. Natürlich kannst du auch auf den Dispatcher über eine Control zugreifen, z.B. label.Dispatcher(...).

Tersus schrieb:
Übrigens funktioniert System.Windows.Deployment.Current.Dispatcher.BeginInvoke( () => foo() ) auch ohne Instanziierung. ;)

Das liegt daran, dass das Dispatcher-Property bereits eine Dispatcher-Instanz ist.
 
Zurück
Oben