Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Ruben
Thema: XML Serialisierung: List<string> wird nicht deserialisiert
Am im Forum: Datentechnologien

Ich könnte hier zwei Aussagen zu machen:

1. Je nach Implementierung der Klasse, in der sich die Liste befindet, konnte diese nicht erfolgreich deserialisiert werden, weil dort etwas an Code vorhanden ist, was den Mechanismus zu deserialisieren beeinflusst.

Hier muss ich dem guten "MrSparkle" zustimmen.
Ohne weitere Informationen wird niemand imstande sein eine passende Lösung vorzuschlagen oder zumindest zu helfen, den richtigen Weg zu finden.

2. Ein Alternative wäre (ohne zu Wissen was in der Klasse implemtiert ist) auch mal den DataContractSerializer auszuprobieren.
Der kann auch Objekte nach XML serialisieren und umgekehrt.
Auseinandersetzen kannst man sich damit auf dieser Seite:
DataContractSerializer-Klasse

Thema: Class im Hintergrund ausführen und Methoden davon aufrufen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich denke, ich verstehe in etwa worum es geht.

Für ein sauberes Threading muss man festlegen, wie der Thread laufen soll und wie er gestoppt werden darf.

Es ist nicht ohne Weiteres möglich (es gibt schon Methoden, aber die würde ich nicht empfehlen) einen Thread zu stoppen, wenn die Methode, die ausgeführt wird selbst nicht überprüft, ob sie ihre Arbeit abbrechen muss oder weitermachen kann.

Grundsätzlich kann der Thread in deinem Fall in der Klasse myProcessor erstellt werden und über Abort beendet werden.
Denn Abbruch über Abort zu machen, wäre jedoch nicht sehr klug, da dies ungeahnte Folgen haben kann.
Zum einen wird eine ThreadAbortException im laufenden Thread ausgelöst und zum anderen kann man nicht bestimmen wo genau der Abbruch stattfinden soll.

Dann würde das wie folgt aussehen:


Class myProcessor
{
    private BlackBoxWorker bbWork;
    private bool running;
    private Thread myThread;

    public myProcessor() {
        bbWork = new BlackBoxWorker();
    }

    public void Starting() {
        myThread = new Thread(bbWork.Work);
        myThread.Start();
        running = true;
    }

    public void Stopping() {
        if (running) {
            myThread.Abort();
        }
        running = false;
    }
}

Um aber eine geeignete Methode zu finden, muss natürlich klar sein wie in diesem Beispiel der BlackBoxWorker seine Arbeit im Hintergrund ausführen soll.
Die Verwendung einer while-Schleife und das Prüfen des Parameters running deutet für mich darauf hin, dass die Arbeit in der Work-Methode immer vollständig abgeschlossen werden muss und dann wiederholt werden soll.
Sehe ich das richtig?

Solche grundsätzlichen Formulierungen sind wichtig, damit auch hilfreiche Antworten gegeben werden können ;-)

Ich gehe daher einmal von folgender Sachlage aus:
Es gibt die Klasse BlackBoxWorker.
Diese Klasse besitzt die Methode Work.
Die Methode Work erledigt bestimmte Aufgaben, die vollständig ausgeführt werden müssen.
Wenn die Arbeit abgeschlossen wurde, soll dieser Schritt wiederholt werden, sofern kein "Stop" (Abbruch) signalisiert wurde.

Wenn dies das Ziel ist, dann könnte die Lösung auch wie folgt aussehen:


class myProcessor
{
    private BlackBoxWorker bbWork;
    private bool running;           // Wird vom Thread festgelegt; zur Prüfung ob der Thread beendet wurde
    private bool doAgain;           // Wird vom Thread beim Start festgelegt; zur Angabe, ob die Arbeit wiederholt werden soll
    private Thread myThread;

    public myProcessor() {
        bbWork = new BlackBoxWorker();
    }

    public void Starting() {
        if(running) return;

        myThread = new Thread(this.Worker);
        myThread.Start();            
    }

    private void Worker() {
        running = true;
        doAgain = true;

        while(doAgain) {
            bbWork.Work();         // This is blocking the whole Thread for some time
            Thread.Sleep(5000);
        }

        running = false;
    }


    public void Stopping() {
        if(!running) return;

        doAgain = false;
        myThread.Join();            // (optional) wartet auf den Abschluss des Threads
    }
}

class Application
{
    static void main (args)
    {
        myProcessor mP = new myProcessor();

        // doing work here ....

        // myProcessor im background starten ....
        // aber wie ?
        mP.Starting();

        // doing work here

        // myProcessor im background stopen ....
        // aber wie ?
        mP.Stopping();

    }
}

Vielleicht konnte ich ja doch helfen :-)

Thema: Excel Export ohne COM und ohne SpreadsheetML
Am im Forum: Office-Technologien

Hallo Fr3dd1,

einen Verweis hat dN!3L (dem ich das Leben einmal ziemlich schwer gemacht habe ^^) schon auf mein Thema gemacht.

Dort findet man ganz am Ende einen Link zu dem HIER.

Das Projekt heißt zwar ExcelReader, aber schreiben bzw. erstellen von Excel-Dateien im XLS-Form geht auch.
Der Entwickler dieses Projekt hat sich die Mühe gemacht, das CDFF (Compound Document File Format) über eine eigene Bibliothek anzusteuern.

Leider gibt es von Microsoft keine Bibliotheken für das alte Format (von 97 bis Office 2003). Aber der Aufbau der verschiedenen Office-Dateien ist öffentlich bekannt. Anhand dessen hat auch OpenOffice seine Bibliotheken aufgebaut.

Schau einfach mal rein in den ExcelReader.
Unter Umständen muss man den Code noch etwas anpassen, weil ich in bestimmten Situationen Fehler erhielt - aber nur geringfügig.


Gruß
Ruben

Thema: Exceldateien (xls) binär schreiben - Ohne COM-Interop (PIA)
Am im Forum: Office-Technologien

Jetzt treffe ich allmählich an die Grenzen des OleDB-Treibers denke ich ^^.

Beim Schreiben in eine Excel-Datei erhalte ich folgenden Fehler:

Das Datenbankmodul kann '[SpaltennameDerGenau65ZeichenLangIst]' nicht finden. Stellen Sie sicher, dass es sich um einen gültigen Parameter oder Alias-Namen handelt, der keine ungültigen Zeichen oder falsche Zeichensetzung enthält und dessen Name nicht zu lang ist.

Ich vermute das Problem ist klar: 65 Zeichen sind einfach zu viel für den.
Dann wohl doch binär.

Thema: Exceldateien (xls) binär schreiben - Ohne COM-Interop (PIA)
Am im Forum: Office-Technologien

Zitat von FZelle
Könnte es sein das Du diesen Post nicht wirklich gelesen hast?
Wir haben dir so etwas schon gleich zu Anfang gepostet.

Das war etwas unabsichtlich und mein Fehler. Deshalb ja auch ausgegraut.

Thema: Exceldateien (xls) binär schreiben - Ohne COM-Interop (PIA)
Am im Forum: Office-Technologien

Zitat von dN!3L
Zitat von Ruben
Zudem bin ich noch auf ein anderes Problem gestoßen: "Feldgröße zu klein"
Nimm den Datentyp "Text".

dN!3L

Danke, das ist das eingzige, dass ich wirklich wissen musste.
Leider wusste ich nicht, dass der Datentyp "Text" heißen muss, aber vermutlich habe ich nicht lange danach gesucht.
Zitat von dN!3L
Woraus schlussfolgerst du denn das nun schon wieder? Probier es einfach aus und teil uns das Ergebnis aus.
KORREKTUR
Das ist leicht: varchar(255) und Char ist im SQL dasselbe. Beides funktioniert in deinem beispielt mit dem Erstellen von Tabellen und in meinem Post mit den ALTER TABLE [Tabelle1$] ADD Spalte2.

Das ist leicht: varchar(255) und Char ist im SQL dasselbe. Beides funktioniert in deinem Beispiel mit dem Erstellen von Tabellen.
Und in meinem Post mit den ALTER TABLE [Tabelle1$] ADD Spalte2 ist es dasselbe Prinzip.

Nebenbei: Ich benutzte zusätzlich den Server-Explorer um die Ergebnisse einzusehen und natürlich trenne ich jedes mal die Verbindung, damit die Datei nicht blockiert wird (bin ja nicht blöd - zumindest nicht ganz ^^)

Jetzt habe ich folgenden Test gemacht:

SQL: ALTER TABLE [Tabelle1$] ADD Spalte2 Text;
Error: Unzulässige Operation.
Eine Ausnahme (erste Chance) des Typs "System.Data.OleDb.OleDbException" ist in System.Data.dll aufgetreten.
SQL: ALTER TABLE [Tabelle1] ADD Spalte2 Text;
Error: Tabelle/Einschränkung kann nicht gefunden werden.:
Eine Ausnahme (erste Chance) des Typs "System.Data.OleDb.OleDbException" ist in System.Data.dll aufgetreten.
SQL: ALTER TABLE Tabelle1$ ADD Spalte2 Text;
Error: Syntaxfehler in ALTER TABLE-Anweisung.
Eine Ausnahme (erste Chance) des Typs "System.Data.OleDb.OleDbException" ist in System.Data.dll aufgetreten.
SQL: ALTER TABLE Tabelle1 ADD Spalte2 Text;
Error: Tabelle/Einschränkung kann nicht gefunden werden.
Funktioniert nicht im Server-Explorer und natürlich auch nicht im Code.

Thema: Exceldateien (xls) binär schreiben - Ohne COM-Interop (PIA)
Am im Forum: Office-Technologien

EDIT: @dN!3L
Entschuldige, dN!3L.
Ich wollte keinesfalls, dass du meine Arbeit übernimmst.
Ich habe lediglich noch nicht alle Ergebnisse meiner Testläufe gepostet.
Schließlich habe die nicht die Geduld immer zu warten bis mir jemand anwortet, sondern versuche derweil selber weiter zu kommen.



Create Table Daten
(
   SPALTENNAME varchar(255)
);

Das ist meine Alternative, dann habe ich eine Tabelle, aber es kommen noch mehr Probleme.

Es ist nicht möglich mehr als einen Datensatz in einem SQL-Statement hinzuzufügen.
Das habe ich auf zwei Arten versucht:
VERSUCH 1 - Mehrfach Values

INSTERT INTO Daten
VALUES
(
     WERT1, WERT2
),
(
     WERT1, WERT2
);
Fehlermeldung: Fehlendes Semikolon.
Jedoch habe ich ein Semikolon gesetzt.
Vermutung: Der Interpreter erwartet das Semikolon nach dem ersten Values-Block, wo jedoch ein Komma steht.

VERSUCH 2 - Mehrere SQL Statements in einem String

INSERT INTO Daten VALUES (WERT1, WERT2);
INSERT INTO Daten VALUES (WERT1, WERT2);
...
Fehlermeldung: Nach der SQL-Anweisung stehen noch weitere Zeichen.
Damit ist es nicht möglich, nachdem man mit einem Semikolon abgeschlossen hat noch weitere SQL-Anweisungen zu schreiben.
Einzige Lösung (das wohl schlimmste überhaupt) die SQL-Anweisungen pro Datensatz in eine For-Schleife packen.
Da kann die Datenbankschnittstelle schon gut mehrere 1000+ mal angesprochen werden. Wie ich finde, nicht die beste Lösung.

Zudem bin ich noch auf ein anderes Problem gestoßen:
Feldgröße zu klein
Leider kann ich nur 255 Zeichen in ein Feld schreiben, aber es kommt vor, dass manche Felder zumindest ein bisschen mehr brauchen. Damit hätte ich noch Datenverlust.

EDIT3:
Zitat von dN!3L
Da haste ein Snippet mit ALTER TABLE:
Demnach kann ich nur bei selbst erstellten Tabellen ALTER TABLE verwenden und nur über mehrere NonExcecuteQuery() in einer For-Schleife zum hinzufügen von Datensätzen benutzen, richtig?

Gibt es eigentlich eine Lib oder ähnlich, über die man Excel-Dateien binär schreiben kann oder muss man die selber schreiben?

Thema: Exceldateien (xls) binär schreiben - Ohne COM-Interop (PIA)
Am im Forum: Office-Technologien

Das Semikolon ist nur hier im Beitrag ;)

Aber ich habe deinen Rat beherzigt und alle einmal durchgetestet.
Einmal HDR=Yes und dann HDR = No

ConnectionString


String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Persist Security Info=False;Extended Properties=\"Excel 8.0;HDR=No\"", filepath)

Folgende (unerfreuliche) Ergebnisse:

HDR = Yes

ALTER TABLE [Tabelle1$] ADD Spalte2 WChar(255);
Exception.Message: Syntaxfehler in Felddefinition.

ALTER TABLE [Tabelle1$] ADD Spalte2 varchar(255);
Exception.Message: Unzulässige Operation.

ALTER TABLE [Tabelle1] ADD Spalte2 varchar(255);
Exception.Message: Tabelle/Einschränkung kann nicht gefunden werden.


HDR = No

ALTER TABLE [Tabelle1$] ADD Spalte2 varchar(255);
Exception.Message: Unzulässige Operation.

ALTER TABLE [Tabelle1$] ADD F2 varchar(255);
Exception.Message: Unzulässige Operation.

ALTER TABLE [Tabelle1] ADD F2 varchar(255);
Exception.Message: Tabelle/Einschränkung kann nicht gefunden werden.

Du hast nicht zufällig auch ein Beispiel, dass ich testen könnte?


EDIT:
siehe Unten

Thema: Exceldateien (xls) binär schreiben - Ohne COM-Interop (PIA)
Am im Forum: Office-Technologien

Unterstützt der JET-Treiber mit OLEDB kein ALTER TABLE oder habe ich was im Syntax falsch?


ALTER TABLE [Tabelle1$]
	CHANGE F1 Spalte1 varchar(255);
	ADD Spalte2 varchar(255);

Standardmäßig ist in einem leeren Tabellenblatt das Feld F1.
Leider kann ich weder etwas ändern noch hinzufügen.

Kennt wer das Problem?

Thema: Problem: Zwei Asynchrone durchläufe - Identisch und doch verschieden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat von ujr
Welchen Wert hat b, wenn Du die folgende Zeile an den Anfang von AuftragComboBoxInit schreibst:


bool b=InvokeRequired;

Gut, das mit der ID war nur ein Testbeispiel, aber hier die Auflösung ;)


bool b = this.InvokeRequired;
System.Diagnostics.Debug.Print("b ist [{0}]", b);

Ergebnis:

b ist [False]
Nach der MSDN ist alles richtig.
Und die AuftragComboBoxInit-Methode wird auch direkt im ComboBox_Leave-Ereignis aufgerufen (ist mein Fehler, dass das leider nicht so ersichtlich war).

Thema: Problem: Zwei Asynchrone durchläufe - Identisch und doch verschieden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat von ujr
ist denn überhaupt sichergestellt, das "AuftragComboBoxInit" (seltsamer Name, übrigens) im GUI-Thread ausgeführt wird?
Ja, ich habe die ThreadID am Anfang der Methode geprüft. GUI-Thread war ID 1
Die asynchrone Methode hatte die Thread ID 5.
Im Post war es dann die Thread ID 4 - also ein dritter Thread.
Zitat von ujr
Erzeuge doch mal testweise die verwendete "AsyncOperation" auch im Load-Ereignis.
Die Methode kann ich leider nicht so leicht in das Load-Ereignis schieben, da sie auf den ausgewählten Wert in der ersten ComboBox reagiert.

ABER jetzt aufgepasst
Ich habe stattdessen die Methode im Load-Ereignis (der ersten ComboBox), welche vom Prinzip her dasselbe wie die gepostete Methode macht, in ein Click-Ereignis von einem Button gepackt.
Jetzt ratet mal was passiert ist...
Dasselbe Problem wie bei der zweiten ComboBox!
- GUI-Thread ist ID 1
- asynchrone Methode ist ID 4
- Post-Thread ist ID 5
(gut - die IDs sind andersrum ;)

Schlussfolgerung:
Alle asynchronen Vorgänge, die im Load-Ereignis initiiert werden, werden beim Aufruf von Post an den GUI-Thread geleitet.
Alle anderen Ereignisse (bisher getesteten zumindest) können die erstellten AsyncOperation.Post-Aufrufe nicht an den GUI-Thread leiten.

Ursache:
Aus mir nicht bekannten Gründen kann nur das im Load-Ereignis erstellte AsyncOperation-Objekt erfolgreich alle Post-Aufrufe an den GUI-Thread weiterleiten. Wenn das AsyncOperation-Objekt in einem anderen Ereignis erzeugt wird, das schließlich auch von demselben Thread, wie im Load-Ereignis ausführt wird (geprüft: ManagedThreadID;Thread.Name;ContextID), dann funktioniert der Aufruf der Post-Methode nicht bzw. er wird in einem dritten Thread ausgeführt.

Lösung:
Am beste ein AsyncOperation-Objekt als private-Field in der Form oder Klasse definieren und alle Post-Aufrufe auf dasselbe AsyncOperation-Objekt konzentrieren.
VORSICHT: Kein AsyncOperation.OperationComplete oder .PostOperationComplete aufrufen, dann wird das AsyncOperation-Objekt unbrauchbar. Am besten erst in Dispose oder Closing aufrufen.

(bitte um Korretur, falls notwendig, ansonsten werde ich dieses Thema als GELÖST setzen - wenn jemand eine Erklärung hat, dann wäre das auch sehr gut ;)

Thema: Zwei IEnumerable ohne doppelte Elemente vereinen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat von markuss21
nur verwende ich eigene Klassen as IEnumerable, und der Union scheint nicht zu funktionieren....
Beim Implementieren von IEnumerable wird doch nur die GetEnumerator()-Methode hinzugefügt.
Erzeugst du da einen eigenen Enumerator oder wo kommt der her?

Thema: Exceldateien (xls) binär schreiben - Ohne COM-Interop (PIA)
Am im Forum: Office-Technologien

Zitat von dN!3L
Mal den JET-Treiber installiert? Im verlinkten Snippet sind beide Varianten drin, weil je nach 32/64 bit mal der eine, mal der andere funktioniert. Treiber sollten z.B. Microsoft Access Database Engine 2010 Redistributable reichen.

Also der Jet-Treiber ist - denke ich - nur für 2003 geeignet. Jedenfalls benutzt du doch in deinem Ausschnitt den Microsoft.ACE.OLEDB.12.0 für xlsx-Mappen. Ich habe mit dem Jet-Treiber kein Ergebnis bei 2007-Mappen erreichen können.
Zitat von dN!3L
Ich kann damit sowohl XLS- als auch XLSX-Dateien lesen und schreiben...

Auch formatieren? ?(

Muss dazu eine Datei vorhanden sein bzw. müsste ich am besten eine Datei im Format 2000-2003 speichern und in mein Projekt in den Storage packen oder kann ich damit sogar die Dateien ganz erstellen?

Thema: Problem: Zwei Asynchrone durchläufe - Identisch und doch verschieden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Da es nicht geeignet ist Code-Dateien hochzuladen, muss ich wohl oder übel den Platz im Forum ausnutzen ;)

Ich habe jetzt den Code so gut wie möglich gekürzt. Ich hoffe übersichtlich.

EDIT:
Es handelt sich um eine ComboBox in der Autragsnummern angezeigt werden.
AuftragComboBoxInit steht dafür, dass das Eintragen der Werte in die ComboBox initiiert werden soll.
Hoffe, dass es nachvollziehbar ist ^^



        // --------------------------------------------------------- //
		// Diese Methode befüllt die zweite ComboBox NICHT erfolgreich.
		// Alle Post-Methoden werden in einem DRITTEN Thread ausgeführt.
		// --------------------------------------------------------- //
        private void AuftragComboBoxInit(Produkt p)
        {
			// INFO: GUI-Thread ID - [1]
			System.Diagnostics.Debug.Print("START - GUI-Thread: {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
			
			// ...
			
			// Erstellen einer AsyncOperation um die Vorgänge beim Befüllen der ComboBox zu synchronisieren
            AsyncOperation asyncOp = AsyncOperationManager.CreateOperation("auftragComboBox");
			
			// ...
			
			// INFO: eine weitere annonyme Methode wird definiert ^^
            MethodInvoker m =
                delegate()
                {
					// ...

					// INFO: Die ID ist definitiv anders als die vom aufrufenden GUI-Thread - [5]
					System.Diagnostics.Debug.Print("ANFANG - Thread: {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);

					// Dieses WaitHandle dient dazu, die Post-Aufrufe zu synchronisieren,
					// sonst würde die Methode schon abgelaufen sein, bevor der erste Post vom GUI-Thread verarbeitet wird.
                    System.Threading.AutoResetEvent postWait = new System.Threading.AutoResetEvent(false);

					// ...
					
                    for (int i = 0; i < number; i++)
                    {
						// ...
						
						// Post wird aufgerufen um die Daten in die ComboBox zu bringen
                        asyncOp.Post(
                            delegate(object args)
                            {
                                try
                                {
									// INFO:
									// Wenn der Wert FALSE ist, dann brauch die Aktion nicht ausgeführt werden
									//
									// IMPORTANT:
									// Hier tretet der entscheidende Fehler auf,
									// obwohl der Aufbau derselbe ist wie im ersten Durchlauf der ersten ComboBox
                                    this.cboAuftragsnummer.Items.AddRange(datenArray);
                                }
                                catch (Exception)
                                {
									// IMPORTANT:
									// Es ist eine Exception wegen eines threadübergreifenden Vorgangs aufgetreten.
									// Die ID dieses Threads ist [4]
									// (HINWEIS: [4] ist dieselbe ID wie beim Thread in "ProduktComboBoxInit()")
									// (Werden IDs also doppelt vergeben, wenn der eine Thread nicht mehr ausgeführt wird?)
                                    System.Diagnostics.Debug.Print("ERROR - Thread: {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
                                }
								
								// Signalisiert, dass der Thread seinen Vorgang fortsetzen kann.
                                postWait.Set();
                            }, null);
							
						// Thread wartet bis der Post abgeschlossen wurde.
                        postWait.WaitOne();
						
						// Kurze Pause ;)
						System.Threading.Thread.Sleep(0);
						
						// ...
                    }

                    // ...

					// OperationComplete wird mit dem letzten Post ausgeführt
                    asyncOp.PostOperationCompleted(
                        delegate(object args)
                        {
                            try
                            {
								// INFO:
								// Wenn der Wert FALSE ist, dann brauch die Aktion nicht ausgeführt werden
								//
								// IMPORTANT:
								// Hier tretet der entscheidende Fehler auf, obwohl der Aufbau derselbe ist wie in "ProduktComboBoxInit()"
                                if (lastA != null)
                                    this.cboAuftragsnummer.Items.AddRange(datenArray);
                            }
                            catch (Exception)
                            {
								// IMPORTANT: (prinzipiell dasselbe wie oben)
								// Es ist eine Exception wegen eines threadübergreifenden Vorgangs aufgetreten.
								// Die ID dieses Threads ist [4]
								// (HINWEIS: [4] ist dieselbe ID wie beim Thread in "ProduktComboBoxInit()")
								// (Werden IDs also doppelt vergeben, wenn der eine Thread nicht mehr ausgeführt wird?)
                                System.Diagnostics.Debug.Print("ERROR - Thread: {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
                            }
							
							// Signalisiert, dass der Thread seinen Vorgang fortsetzen kann.
                            postWait.Set();
                        }, null);
						
					// Thread wartet bis PostOperationCompleted abgeschlossen wurde.
                    postWait.WaitOne();
					
					// das WaitHandle wird freigegeben
					postWait.Close();
					
					// Die ID dieses Thread ist [5]
                    System.Diagnostics.Debug.Print("ENDE - Thread: {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
                };

			// Startet den asynchronen Vorgang
			m.BeginInvoke(delegate(IAsyncResult result)
			{
				m.EndInvoke(result);                    
			}, null);
			
			// ...
        }

Thema: Convertierung VB Nach C#
Am im Forum: Office-Technologien

Die Konvertierung leicht gemacht: (funktioniert sehr gut - jedenfalls C# to VB)
DeveloperFusion

Den SourceCode gibt es auch. Der ist OpenSource.
SourceCode - SharpDevelop 3.2

Thema: Problem: Zwei Asynchrone durchläufe - Identisch und doch verschieden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat von chilic
Geht es hier wirklich um so viele Einträge dass ein synchrones Befüllen nicht geht, oder dauert nur das Laden der Daten so lange?
Im zweiten Fall könntest du ja nur das Laden asynchron machen und das befüllen dann "normal", dann hast du schon das ganze Threadübergreifende mit Control nicht mehr.
Synchron hatte ich das vorher, aber es gibt immer kurze Ladezeiten (ca. 1-2 Sek) und da ist eine "gefühlte Ewigkeit" ^^.

Und einmal danke für die anderen schnellen Antworten. ;)

Mir ist bekannt, dass man mit Control.Invoke am besten diese Synchronisierung durchführt, doch bei meinem Beispiel tretet das Problem auf, dass es beim einen mit AsyncOperation funktioniert und beim anderen nicht. Das wird mir einfach nicht klar. Ich habe auch schon gedacht, dass es daran liegt, dass im Load-Event keine threadübergreifenden Vorgänge gemeldet werden, aber das war es auch nicht, denn da wird sauber synchronisiert.

EDIT:
Habe eine Änderung gemacht und es vorerst synchron laufen lassen
Bisher keine Verzögerung, aber die Lösung für das Problem würde mich dennoch interessieren.


        private void cboProduktnummer_Leave(object sender, EventArgs e)
        {
            Produkt p = (Produkt)this.cboProduktnummer.SelectedItem;
            if (p == null)
            {
                this.cboAuftragsnummer.Items.Clear();
                this.current = null;
                return;
            }

            if (p.Equals(this.current))
                return;
            else
            {
                // synchron
                this.cboAuftragsnummer.Items.Clear();
                this.cboAuftragsnummer.Items.AddRange(p.Auftrage.Values.ToArray());
                this.current = p;

                // asynchron
                //this.AuftragComboBoxInit(p);
            }
        }

Thema: Problem: Zwei Asynchrone durchläufe - Identisch und doch verschieden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo zusammen,

Mein System:
Windows XP - SP 2
Visual Studio 2008 Team System
.Net 3.5 - Framework
etc.

Folgende Situation:
- Eine Form hat zwei ComboBoxen.
- Beide ComboBoxen werden asynchron gefüllt.
- Aufruf der asynchronen Methoden läuft über einen Handler bzw. Delegaten
und wird über BeginInvoke gestartet.
- Um das Befüllen der ComboBoxen zu synchronisieren nutze ich AsyncOperation.
- Die asynchrone Methode für die erste ComboBox wird im Load-Event gestartet.
- Im Load-Event wird zuerst ein AsyncOperation im AsynOperationManager erzeugt.
- Das AsyncOperation-Objekt wird dann an die asynchrone Methode übergeben.
- Die erste ComboBox wird über die Post-Methode erfolgreich und asynchron gefüllt.

Das Problem:
- Die zweite ComboBox wird im Leave-Event der ersten ComboBox gefüllt.
- Beim Aufrufen der Post-Methode wird der Vorgang in einem anderen Thread ausgeführt und es wird eine Exception geworfen.
(Threadübergreifender Vorgang)

Das Prinzip bei der zweiten ComboBox ist dasselbe, aber es funktioniert igendwie nicht.
Erst dachte ich, dass die Form keine Post-Aufrufe verarbeiten kann, weil ich einen Wartepunkt im Event setze - sollte ein anderer Prozess bereits laufen -, aber die Form hat nicht gewartet bzw. diesen Punkt nicht erreicht.

EDIT:
Zur Lösung springen

Thema: Exceldateien (xls) binär schreiben - Ohne COM-Interop (PIA)
Am im Forum: Office-Technologien

Zitat von dN!3L
Und auslesen via OleDbConnection kommt nicht infrage? Dafür brauchst du kein installiertes Office, lediglich die passenden OLE-DB-Treiber.

Gruß,
dN!3L

Gut, ich werde das eventuell so machen.

Ich habe das zwar nicht genannt, aber kann man dann auch Excel 2007 - Dateien (xlsx) auf eine binäre oder andere Art effektiv auslesen?
Der OleDB-Treiber (Microsoft.ACE.OLEDB.12.0) für Excel ist leider nicht vorinstalliert. Gibt es da Alternativen? (außer installieren)


EDIT:
Aber das Problem mit den erstellen von Excel-Dateien (xls) im Format für Excel 2000-2003 besteht damit immer noch.

Thema: Exceldateien (xls) binär schreiben - Ohne COM-Interop (PIA)
Am im Forum: Office-Technologien

Meine Problemstellung ist folgende:

Ich muss Exceldateien lediglich auslesen können, auch wenn das angegebene Office nicht installiert ist. Jedenfalls ist das schneller als die COM-Interop-Schnittstelle, die ich nur zu gerne umgehen möchte.
Bevorzugen tue ich XML in jedem Fall. Ich habe mir bereits eine angepasste Bibliothek für das generieren von XML-Exceldateien geschrieben und klappt wunderbar - nur beim Auslesen ist das nicht sonderlich hilfreich.

Ein weiterer Punkt ist, dass ich ein Programm habe, welches derzeit Excel-Dateien auf XML-Basis generiert, aber wenn ein Anwender nur Office 2000 hat, dann läuft das leider nicht und ich habe deshalb bereits Anfragen bekommen, ob sich das lösen lässt. Natürlich rate ich lieber auf die bessere Office-Version zu upgraden, aber schaden kann es nicht, wenn ich auch die Möglichkeit hätte die binären Exceldateien zu generieren.


Und vielen Dank für eure bisherigen Antworten ;)

Thema: Exceldateien (xls) binär schreiben - Ohne COM-Interop (PIA)
Am im Forum: Office-Technologien

Hallo erstamal,

also möglich ist diese Sache schon, aber ich wollte nur wissen, ob jemand schonmal irgendwo eine Bibliothek dafür gesehen hat.

Das würde mich sehr interessieren.
Hier gibt es die Dokumentation von Microsoft zu dem binären Aufbau der Excel-Dateien.

Oder wäre das eher eine Idee für ein Community-Projekt?

Im Internet bin ich bislang nur auf anderssprachige und kostenpflichtige Teile gestoßen. Bei OpenOffice schau ich noch. Da sollte es sowas eigentlich geben.

EDIT:
Mir geht es dabei um Dateien von 2003 und älter.

Thema: Excel Export (keine automatiesierung kein Spreadsheet ML)
Am im Forum: Web-Technologien

Zitat von 4.Net
Naja mal schauen, ich glaub ich ruf mal bei MS an und sag denen mal die sollen endlich auch mal die binary file definition freilegen

Das hat OpenOffice schon gemacht. 8)

Schau her

EDIT:
hab grad das von Microsoft gefunden
Hier

Thema: Aus Word 2003 per COM einzelnes Mergefield auslesen
Am im Forum: Office-Technologien

Zitat von Cratsh
Aber du hast die ComObjekte dann in der Forschleife gecastet in Fields oder?
Wie hast du sonst das Fields.get_Item ausgeführt?

Also wie gesagt mit der PIA von 2003 läuft mein Projekt auch ohne Comwrapper mit Office 2010.

Wenn man den Com-Wrapper verwendet macht es ja keinen Sinn das ganze noch zu Casten. Dann könnte ich ja gleich die Objeke des PIA-Bibliothek benutzen.
Am besten ich zeige mal wie ich das gelöst habe...

Mein Code sieht (ungefähr) so aus:


ComObject mergeFields = null;
ComObject mergeField = null;
try
{
     mergeFields = document.GetObjectReturningProperty("Fields");
     int count = (int)mergeFields.GetProperty("Count");
     for (int i = 0; i < count; i++)
     {
          mergeField = mergeFields.GetObjectReturningFunction("Item", i);

          // ... Code mit dem Field-Objekt
     }
}
finally
{
     if(mergeFields != null)
          mergeFields.Dispose();
     if(mergeField != null)
          mergeField.Dispose();
}

Thema: Aus Word 2003 per COM einzelnes Mergefield auslesen
Am im Forum: Office-Technologien

Genau dasselbe habe ich vor kurzem gemacht.

Unter der Verwendung des Com-Wrapper von Rainbird habe ich ein Word-Dokument geöffnet und alle Formularfelder (oder auch Mergefields) ausgelesen und ausgewertet.

Dank des Com-Wrapper läuft es sogar auf Office 2007 (habe es auf einen PC mit Office 2003 entwickelt).

Mein Vorgehen
Jedoch bin ich ohne Enumeration dadurch gegangen.
Ich habe die Document.Fields als ComObject ausgelesen.
Dann eine For-Schleife gebaut.
Als Hochwert habe ich den Wert aus Fields über den Com-Wrapper von Count genommen.
Anschließend habe ich nur die Aufrufe über Fields.Item(int index) oder Fields.get_Item(int index) gemacht. Ich würde beim Com-Wrapper beides mal probieren.

Thema: TCP Keepalive / Polling
Am im Forum: Netzwerktechnologien

Lohnt sich nicht, habe das Problem gelöst.

Ich habe einmal vergleicht, wo der Unterschied zwischen dem Trennen der Verbindung vom Client zum Server mit dem Trennen der Verbindung vom Server zum Client liegt und habe dabei folgendes festgestellt:
Ich habe die Tickzahl jeweils für das Senden von Disconnect und das Schließen des NetworkStream genommen.
Beim Client-Disconnect gab es eine Differenz von gut 10000+ Ticks und beim Server 0 Ticks. Der Unterschied beim Client war, dass ich das Senden der Disconnect-Nachricht asynchron ausgeführt habe.

Beim Server habe ich das dann so gelöst:
Ich habe einen anonymen Delegaten als System.Threading.ThreadStart deklariert (weil ThreadStart ein einfacher Delegat ohne Parameter und ohne Rückgabewert ist) und das Senden des Disconnect über BeginInvoke (also asynchron) ausgeführt. Im eigentlichen Thread habe ich noch einen Wartepunkt benutzt und dann erst den Stream geschlossen. Und es funktioniert.

Soll ich am besten noch einen Thread als gelöst öffenen? ^^

Thema: Fenster laufend neu zeichnen, ohne 100% CPU-Last zu erzeugen
Am im Forum: Grafik und Sound

Zitat von DaemNice
Dir ist schon klar das das ne endlosschleife ist.

sobald die Methode DoUpdateAndDraw fertig ist wird sie wieder aufgerufen
Ich denke DaemNice meint damit, dass dieser Prozess von außen niemals abgebrochen werden kann... also endlos ist. Aber ich hoffe, dass das nur in dem Beispiel so ist.

Zitat von Tsuyo
/Edit²:
Okay, es war doch nicht die Lib, wenn ich ein Sleep in die While mache, ist die CPU immer auf 0. Kann mir jemand erklären wieso?
Mehr als das bisher gesagte, kann ich dazu leider auch nicht sagen ^^.
Zitat von Tsuyo
Damit lade ich ein Bild auf ein LCDbildschirm.
Vielleicht hilft es die Anzahl der Bilder pro Sekunde zu steuern als das über diese Schleife die Bilder so schnell aktualisiert werden, wie Leistung des Prozessors es schaffen kann.
Mit GPU und Bildausgabe kenne ich mich nur leider nicht so aus.

Thema: Socket vs. TcpListener
Am im Forum: Netzwerktechnologien

Nur zur Ergänzung: (korrigiert mich gerne ;)

Wenn ich ein selbst definierten Timout nutzen möchte,
dazu nur kleine Datenmengen (ca. 1 - 1024 Bytes) möglichst ohne Verzögerung schicken möchte
und Verbindungsabbrüche schnell erkennen will...

...dann ist die Verwendung von Socket (gerne den von TCPClient) sinvoll.

Richtig?

Thema: Information zwischen 2 Forms
Am im Forum: GUI: Windows-Forms

Hallo Franklin,

mir fallen da folgende Möglichkeiten ein:

1. Form1 an Form2 übergeben - geringer Aufwand
Einfach einen 2. Konstruktor schreiben, der die entsprechende Form annehmen kann.
Der Konstruktor sollte so aussehen:


     public class Form2
     {
          // Standardkonsturktor nicht verändern, dient dem Designer
          public Form2()
          {
               InitializeComponent();
          }

          // Das ist der neue Konstruktor
          public Form2(Form1 form)
               : this() // damit wir der obere Konstruktor mit aufgerufen
          {
               this.form1 = form;
          }

          private Form1 form1;

          // ...
     }

Dann müsste man nur noch die Werte angleichen, je nachdem was du erreichen möchtest.


2. Interfaces benutzen - etwas aufwendiger, aber nützlicher
Interfaces brauch man eigentlich erst, wenn man auf verschiedenen Objekten dieselben Aktionen ausführen möchte. Aber statt die ganze Form zu übergeben (und am Ende noch die Modifer für die ListBox und die TextBox auf "public" zu stellen, empfehle ich Interfaces. Auf diesen Weg kann man die Zuweisung der Daten für die Controls auf Form1 besser steuern.

Im Prinzip übergibt man dann noch immer die Form1 über den Konstruktor (siehe oben). Aber anstatt den Datentyp bei Form1 zu belassen, ändert man ihn auf z.B. IForm1.

Das Interface richtet sich danach, was für Daten man übergeben möchte.
Wenn du nur mit der ListBox.DataSource-Eigenschaft und der TextBox.Text-Eigenschaft arbeitest, dann könnte das mit dem Interface so aussehen:

EDIT: kleine Korrektur am Code ;)


     interface IForm1
     {
          string TextBox1_Text { get; set; }
          object ListBox1_DataSource { get; set; }
     }

     pubic class Form1 : IForm1
     {
          public Form1()
          {
               InitializeComponent();
          }

          // ...

          string IForm1.TextBox1_Text
          {
               get { return this.textBox1.Text; }
               set { this.textBox1.Text = value; }
          }

          object IForm1.ListBox1_DataSource
          {
               get { return this.ListBox1.DataSource; }
               set { this.ListBox1.DataSource = value; }
          }
     }

andere Möglichkeiten sind Events von den Controls von Form2 in der Form1 zu verarbeiten und noch viele mehr...

Vielleicht konnte ich dir ja weiterhelfen ;)

Thema: Fenster laufend neu zeichnen, ohne 100% CPU-Last zu erzeugen
Am im Forum: Grafik und Sound

Hallo Tsuyo,

ich weiß zwar nicht, ob ich da den richtigen Ansatz habe, aber auf jeden Fall kann es helfen, wenn man sowas vermeidet:


     // nicht so
     while(nothingToDo)
          continue;

besser ist dabei sowas zu machen:


     // besser so
     while(nothingToDo)
          System.Threading.Thread.Sleep(0);

Ich kenne zwar deinen Code nicht, aber vielleicht hilft die dieser Ansatz schon.
Wenn ich nur continue verwende, dann läuft der Prozess eventuell mit voller Leistung und versucht so schnell er kann (und so oft wie möglich), diese Schleife zu durchlaufen.
Manmal verwendet man System.Threading.Thread.Sleep um den Thread warten zu lassen und dann wäre der Wert sicher größer als 0.
Falls man aber nur dem System singnalisieren möchte, dass jetzt erstmal die anderen Threads weitermachen können (weil er ja gerade nicht so viel zu tun hat), dann ist der Wert 0 entscheidend. Die Pause begrenzt sich also auf die laufenden Prozesse im System und so kann eventuell unnütz verbrauchte Leistung für diesen Prozess oder Thread mindern. Besonders bei Schleifen ;)

Thema: Callback in MainThread ausführen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Werde ich, machen kleines_eichhoernchen. Mit Multithreading bin ich ja nicht so bewandert wie man sieht, aber ein interessantes Thema, finde ich.

Aber um auf etwas anderes zurück zu kommen...
Mit SynchronizationContext und AsyncOperation sind die Abläufe immer noch in verschiedenen Threads. Habe da etwas rumprobiert.
Bei einer Konsolenanwendung kann das durchaus egal sein. (z.B. wenn ein anderer Thread auf die Konsole schreiben will).

Aber jetzt ein Beispiel:
Ich habe eine Klasse in der über eine Methode ein Thread gestartet wird und über eine andere (sauber) beendet. Der gestartet Thread macht irgendwas (Berechnungen, Prüfungen, etc.) und wirft immer mal wieder ein Event. Das Ergebnis soll dann ausgegeben werden.
Bei einer Konsolenanwendung brauch ich nur die Klasse instanzieren und die Ergebnisse in den Event-Methoden auf der Konsole ausgeben.
In einer Formanwendung müsste ich aber jedes Event prüfen und dann über BeginInvoke oder Invoke im GUI-Thread ausführen.

Meine Frage daher:
Wie kann man eine Klasse so programmieren, dass man nie prüfen muss (wenn man die Klasse benutzt), ob das Event im richtigen Thread ausgeführt wird?
Beim BackgroundWorker kann man ein Event (ProgressChanged) auch ohne Prüfung abfangen.
Wie kann man das in einer Klasse implementieren, sodass es nicht relevant ist, ob man die Klasse in einer Konsole oder einer GUI-Anwendung nutzt?

Am besten wäre ein Codeausschnitt wie man einen Eventaufruf, in der Klasse durchführen kann, dass die angemeldeten Handler im richtigen Thread ausgeführt werden (zumindest bei GUI-Anwendungen).

Thema: Visual Studio 2008 und Team Foundation Server: Wie Patch und ServicePack installieren?
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

das Ding heißt vielleicht so:
Visual Studio Team System 2008 Team Explorer

kann sein dass es auch anders heißt, jedenfalls irgendwas mit TeamExplorer.
Nutzen wir bei uns in der Firma auch.