2016-05-11 13 views
1

Ich habe eine Hauptklasse, die einige Operationen ausführt, und eine andere Klasse, die mit einem Server über einen Socket kommuniziert.Starten von Klassenoperationen in einem separaten Thread

Führt das Erstellen eines Objekts der Socket-Klasse auf die folgende Weise dazu, dass alle Operationen in der Socket-Klasse in einem separaten Thread ausgeführt werden?

await Task.Run(()=>socketObj.initializeSocket()); 

Oder gibt es eine andere Möglichkeit, die Klasse in einem separaten Thread zu starten?

+2

ja es tut .... –

+3

Was meinst du mit * "alle Operationen in der Socket-Klasse" *? Es macht 'initializeSocket' und alles, was innerhalb dieser Methode aufgerufen wird, wird in einem separaten Thread ausgeführt. –

+0

@MattBurland Socket-Klasse hat Methoden wie Connect(), SendAndReceive() etc. Wenn ich diese Methoden aufrufen, werden sie von einem separaten Thread behandelt werden? – Illuminati0x5B

Antwort

0

Die Task Parallel Library (TPL) verwendet eine Vielzahl von Laufzeitheuristiken, um Entscheidungen zu treffen, während die Ausführung der asynchronen Methoden geplant wird. Es gibt keine Garantie, dass es immer in einem separaten Thread gestartet wird (was im Wesentlichen ein Thread aus CLR Thread-Pool ist). Sobald Sie das await-Schlüsselwort verwendet haben, bedeutet dies im Wesentlichen, dass Ihr Haupt-Thread gesperrt ist und keine andere nützliche Arbeit mehr leisten kann, als darauf zu warten, dass Ihre initializeSocket-Funktion beendet wird, bevor Sie fortfahren. Speziell in Fällen, in denen die Socket-Initialisierung wirklich sehr wenig Zeit benötigt, könnte TPL Ihren Hauptanwendungs-Thread verwenden, anstatt ihn auf seinen internen Task-Schedulern zu planen. Ich hatte einige ähnliche Zweifel paar Monate zurück und dieser Thread helfen könnten:

Real purpose of providing TaskScheduler option through ParallelOptions parameter in Parallel class APIs

Weitere Details hier:

Is Task.Factory.StartNew() guaranteed to use another thread than the calling thread?

nicht über andere TPL apis Sorgen Sie in diesen Themen diskutiert statt Task.Run in Ihrem Fall. Eine Aufgabe ist eine Aufgabe, unabhängig von der API, die sie erstellt. Die meisten Heuristiken des Aufgabenplaners bleiben gleich, sobald Sie in die Welt von TPL eintreten.

0

Führt das Erstellen eines Objekts der Socket-Klasse in der folgenden Weise dazu, dass alle Operationen in der Socket-Klasse in einem separaten Thread ausgeführt werden?

Nr

Oder gibt es eine andere Möglichkeit, die Klasse auf einem separaten Thread zu starten?

Ich bin mir nicht sicher, was "Start der Klasse" bedeutet.

Der Code, wie Sie ihn derzeit haben, wird initializeSocket auf einem Thread-Pool-Thread aufrufen. Es führt nicht dazu, dass alle anderen Methoden auf socketObj auf Threadpool-Threads ausgeführt werden.

Verwandte Themen