2012-08-23 8 views
5

Ich entwickle eine Windows Forms-Anwendung, um wenige Operationen auf einem über USB verbundenen Gerät auszuführen. Für alle Operationen wie Lesen, Schreiben und andere Dinge haben wir eine benutzerdefinierte Bibliothek.Stoppt einen bei einem blockierenden Aufruf festsitzenden Thread

Der Schreibvorgang ist abgeschlossen, wenn der Benutzer eine Taste drückt.

Zum Lesen wird ein separater Thread erstellt. Problem mit der verfügbaren Bibliothek ist, dass der Leseaufruf blockiert ist und INFINITE Timeout aufweist.

Bei einem Verbindungsfehler bleibt dieser Thread beim Lesefunktionsaufruf hängen, da diese Funktion nur bricht, wenn Daten empfangen werden.

Was könnte der Weg sein, diesen Thread in einem solchen Szenario zu töten? Thread.Abort() funktioniert nicht.

Ich verwende C# für diese Programmierung.

+1

Wenn die „benutzerdefinierte Bibliothek“ * bietet keine beliebige * bedeutet eine Sperrung auf einem ausgefallenen Verbindung lesen abzubrechen, sollten Sie es weg und verwenden Sie etwas anderes werfen, ehrlich. – Clemens

+0

Ich weiß .... Ich wünschte, ich könnte ... Aber Same ist der Fall mit der Standard-Serial-Port-Klasse von C# ... Lesevorgang wird auf fehlgeschlagene Verbindung fest, wenn ich Timeout zu Infinte festlegen. – Swanand

+0

Sie könnten versuchen, den "Griff" zu schließen, was auch immer Sie versuchen zu lesen ... dann wird das Lesen abgebrochen Ich sollte raten ... und Ihr Thread, je nachdem, wie es geschrieben ist, kann beendet werden. –

Antwort

1

Die von Ihnen gelesene Methode ruft wahrscheinlich systemeigenen Code auf, damit der Thread nicht abgebrochen werden kann. Es gibt keine Möglichkeit (zumindest die, die ich kenne), Thread abzubrechen, der COM-Interop verwendet. Sie könnten sehen, warum der Thread zum Blockieren der Lese-Methode an erster Stelle steht. Versuchen Sie, vor dem Aufruf der Read-Methode nach den Anforderungen zu suchen.

einen Blick auf diese Frage nehmen: Abort call to unmanaged DLL

+0

Ich habe es in einem separaten Prozess ausgeführt. Ich dachte auch, du könntest den gefährlichen Code in einer anderen App-Domain laufen lassen, von dem ich dachte, du könntest vielleicht auch "in den Kopf schießen", aber ... er leidet unter dem gleichen Fehler, ein Thread-Problem abzubrechen, siehe: http://msdn.microsoft.com/en-us/library/system.appdomain.unload.aspx –

+0

Danke für die Idee! Aber wie kann man nur einen Thread in einem anderen Prozess ausführen? ODER Ausführen einer Funktion als ein anderer Prozess? – Swanand

+0

Sie könnten eine andere Anwendung erstellen, die COM Interop (USB-Kommunikation) behandelt und diese Anwendung als Prozess starten. Sie können dann über Pipes http://msdn.microsoft.com/en-us/library/system.io.pipes.aspx mit diesem Prozess kommunizieren –

Verwandte Themen