2017-11-12 1 views
-3

Ich habe, dass ein gefälschtes Asynchron-Verfahren auf diese Weise zu tun, liest, ist es eine schlechte Idee:Aufgabe und Parallel.In einer Bibliothek einlegen, ist es eine schlechte Idee, sie zu verwenden?

public int myMethodSyn() 
{ 
    //sync operations 

    return result; 
} 

public async int myMethodAsync() 
{ 
    return await Task.Run(myMethodSync); 
} 

Einer der Gründe, die ich gelesen habe ist, weil zum Beispiel ASP Skalierbarkeit Probleme mit dieser Art haben können von Bibliotheken, da Tasks den Threadpool verwenden und ASP den Threadpool für die Teilnahme an jedem Aufruf benötigt. Daher kann die Bibliothek alle Threads des Thread-Pools als Block ASP verwenden. SO ist es besser zu erlauben, dass der Klient entscheidet, wie man den Faden-Pool verwendet.

Wenn nicht falsch, Parallel.Invoke verwenden Sie den Thread-Pool auch Methoden parallel zu laufen, so denke ich, dass, wenn ich eine Methode in meiner Bibliothek verwenden, die parallel.Invoke oder parallel.Foreach oder einer dieser Möglichkeiten um Code parallel laufen zu lassen, hätte ich das gleiche Problem. Ist es wahr?

Meine Idee ist, zwei Methoden parallel zu betreiben, weil sie unabhängig sind und ich könnte eine bessere Leistung erzielen, wenn ich sie parallel laufe. So würde ich somthing so haben:

public int myMainMethodSync() 
{ 
    int result01 = myMethod01Sync(); 
    int result02 = myMethod02Sync(); 
    return result01 + result02; 
} 

private void myMethod01Sync() 
{ 
} 

private void myMethod02Sync() 
{ 
} 

public int myMainMethodAsync() 
{ 
    Task myTsk01 = Task.Run(myMethod01Sync); 
    Task myTsk02 = Task.Run(myMethod02Sync); 
    Task.WhenAll(myTsk01, myTsk02); 

    return myTsk01.Result + myTsk02.Result; 
} 

public int Task myMainMethodParallel() 
{ 
    int result01; 
    int result02; 
    Parallel.Invoke(() => result01 = myMethod01Sync(), 
        () => result02 = myMethod02Sync()); 

    return result01 + result02; 
} 

Die Idee ist es eine Synchronisierungsmethode zu haben, die die beiden Methoden synchron laufen. Daher weiß der Client, der die Bibliothek verwendet, dass die Methode keinen Threadpool verwendet.

Später habe ich zwei Möglichkeiten, um die Methoden zur gleichen Zeit mit Aufgaben oder mit parallel.Invoke auszuführen.

Im Falle der Aufgaben verwende ich eine falsche Async-Methoden, weil ich die Synchronisierungsmethode innerhalb einer Aufgabe, die zwei Threads aus dem Threadpool verwenden. Wenn ich nicht falsch liege, wird dies nicht empfohlen. Die andere Option ist die Verwendung von Parallel.Invoke, die auch Threads aus dem Thread-Pool verwendet, also denke ich, dass es das gleiche Problem wie bei Tasks gibt, also denke ich, dass es auch nicht empfohlen wird.

In meinem Fall würde ich lieber Task verwenden, weil ich mit einer Bedingung entscheiden kann, wenn ich die Methode02Sync zum Beispiel nach einer gewissen Einschränkung ausführen soll, also könnte ich die Kosten sparen, um einen Thread zuzuweisen, um die zweite Methode auszuführen Ich weiß, dass es in einigen Fällen nicht benötigt wird. Ich denke parallel. Invoke das ist nicht möglich.

Allerdings denke ich, dass in diesem Fall, wie ich eine Sync-Methode auch implementieren, ich den Client die Methode wählen, die es in seinem Fall besser betrachtet, so wirklich ist es eine schlechte Option, Aufgaben im Async zu verwenden Methode?

Wenn beide Lösungen schlecht sind, Tasks und Parallel.Invloke, dann wird nicht empfohlen, parallelen Code in Bibliotheken auszuführen und nur in der obersten Ebene, in der UI oder im Client der Bibliothek zu verwenden? Weil ich denke, dass in diesem Fall die Verwendung von parallel sehr restriktiv ist, weil es auf der obersten Ebene in der UI nicht möglich ist, parallel zu verwenden, wenn es entscheidet, dass es möglich ist, weil es thread verwendet oder nicht, weil es nicht funktionieren würde habe keine parallelen Methoden.

Zusammenfassend, ist meine Lösung, setzen Synchronisierungs- und Async-Methoden eine schlechte Idee? Ist es eine schlechte Idee, Task oder Parallelcode in den Bibliotheken zu verwenden? Wenn einer von ihnen die bessere Wahl ist, welcher?

Danke.

+0

Wie lange dauert normalerweise jede der Methoden, die Sie aufrufen? Wie viel Beschleunigung bringt Sie parallel? – svick

+0

Bei meiner Frage geht es eher darum, die Unterschiede zwischen Tasks und Parallel.Invoke kennenzulernen und den besten Weg, Bibliotheken zu entwickeln, die parallel arbeiten, wenn es eine gute Idee ist, Bibliotheken zu entwickeln, die Parallelität verwenden. –

Antwort

1

ist meine Lösung, Belichtung Synchronisierung und asynchrone Methoden eine schlechte Idee?

Lassen Sie mich die Frage neu zu formulieren, um es allgemeiner:

Ist es eine gute Idee, zwei Versionen eines Verfahrens mit unterschiedlichen Leistungsmerkmalen zu entlarven?

Ich denke, dass es die meiste Zeit eine schlechte Idee ist. Die API Ihrer Bibliothek sollte klar sein. Sie sollten die Benutzer Ihrer Bibliothek nicht ständig zwischen den beiden Optionen wählen lassen. Ich denke, es ist Ihre Verantwortung als Bibliotheksautor, die Entscheidung zu treffen, auch wenn es für einige Ihrer Benutzer falsch ist.

Wenn die Unterschiede zwischen den beiden Optionen dramatisch sind, können Sie einen Ansatz wählen, bei dem Ihre Benutzer zwischen ihnen wählen können. Aber ich denke, zwei getrennte Methoden zu haben ist die falsche Wahl, etwas wie ein optionaler Parameter wäre ein besserer Ansatz, weil es bedeutet, dass es einen klaren Standard gibt.

Die einzige Ausnahme, die ich denken kann, ist, wenn die Signaturen der beiden Methoden unterschiedlich sind, wie bei wirklich asynchronen Methoden. Aber ich denke nicht, dass das für Ihre Verwendung von Task s gilt, um CPU-gebundene Methoden zu parallelisieren.

Ist es eine schlechte Idee, Task oder parallelen Code in den Bibliotheken zu verwenden?

Ich denke, Sie sollten sie vorsichtig verwenden. Sie haben Recht, dass Ihre Benutzer möglicherweise nicht zufrieden sind, wenn Ihre Bibliothek mehr Ressourcen (hier Threads) verwendet, um sich selbst schneller zu machen. Auf der anderen Seite sind die meisten Methoden zur Parallelisierung von Code schlau genug, dass, wenn die Menge der verfügbaren Thread-Pool-Threads begrenzt ist, sie immer noch gut funktionieren. Wenn Sie also messen, dass die Beschleunigung, die durch die Parallelisierung Ihres Codes erzielt wurde, signifikant ist, dann ist es in Ordnung, dies zu tun.

Wenn einer von ihnen ist es bessere Option, welche?

Ich denke, das ist eher eine Frage, welche Sie lieber als Code-Stil bevorzugen. Die Leistungsmerkmale von Parallel.Invoke() mit zwei Aktionen und synchronem Warten auf zwei Task s sollten vergleichbar sein.

Obwohl im Auge behalten, dass Ihr Anruf Task.WhenAll nicht wirklich etwas tun, da WhenAllkehrt ein Task, die, wenn alle seine Komponenten Task s vollständig abgeschlossen ist. Sie können stattdessen Task.WaitAll verwenden, aber ich bin mir nicht sicher, was der Punkt wäre, da Sie bereits implizit auf beide Task s warten, indem Sie ihre Result s eingeben.

+0

Danke für die klare Antwort. –

Verwandte Themen