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.
Wie lange dauert normalerweise jede der Methoden, die Sie aufrufen? Wie viel Beschleunigung bringt Sie parallel? – svick
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. –