Ich habe recherchiert (einschließlich aller anderen SO-Beiträge zu diesem Thema) die beste Möglichkeit, einen (wahrscheinlichsten) Windows-Service-Mitarbeiter zu implementieren, der Elemente von ziehen wird arbeiten aus einer Datenbank und verarbeiten sie parallel asynchron im "Fire-and-Forget" -Modus im Hintergrund (die Workitem-Verwaltung wird in der asynchronen Methode abgewickelt). Die Arbeitselemente werden Webdienstaufrufe und Datenbankabfragen sein. Es wird eine gewisse Drosselung für den Hersteller dieser Arbeitselemente geben, um eine Art von gemessener Vorgehensweise bei der Planung der Arbeit zu gewährleisten. Die folgenden Beispiele sind sehr einfach und dienen nur dazu, die Logik der while-Schleife und der for-Schleife zu verdeutlichen. Welches ist die ideale Methode oder spielt es keine Rolle? Gibt es einen geeigneteren/performanteren Weg dies zu erreichen?Async/Warten oder Task.Run in Konsolenanwendung/Windows-Dienst
async/await ...
private static int counter = 1;
static void Main(string[] args)
{
Console.Title = "Async";
Task.Run(() => AsyncMain());
Console.ReadLine();
}
private static async void AsyncMain()
{
while (true)
{
// Imagine calling a database to get some work items to do, in this case 5 dummy items
for (int i = 0; i < 5; i++)
{
var x = DoSomethingAsync(counter.ToString());
counter++;
Thread.Sleep(50);
}
Thread.Sleep(1000);
}
}
private static async Task<string> DoSomethingAsync(string jobNumber)
{
try
{
// Simulated mostly IO work - some could be long running
await Task.Delay(5000);
Console.WriteLine(jobNumber);
}
catch (Exception ex)
{
LogException(ex);
}
Log("job {0} has completed", jobNumber);
return "fire and forget so not really interested";
}
Task.Run ...
private static int counter = 1;
static void Main(string[] args)
{
Console.Title = "Task";
while (true)
{
// Imagine calling a database to get some work items to do, in this case 5 dummy items
for (int i = 0; i < 5; i++)
{
var x = Task.Run(() => { DoSomethingAsync(counter.ToString()); });
counter++;
Thread.Sleep(50);
}
Thread.Sleep(1000);
}
}
private static string DoSomethingAsync(string jobNumber)
{
try
{
// Simulated mostly IO work - some could be long running
Task.Delay(5000);
Console.WriteLine(jobNumber);
}
catch (Exception ex)
{
LogException(ex);
}
Log("job {0} has completed", jobNumber);
return "fire and forget so not really interested";
}
Ihr gesamter Code ist falsch. Verwenden Sie nicht 'async void'; Verwenden Sie keine Asynchronität, es sei denn, Sie haben tatsächlich asynchrone Operationen, führen Sie keine asynchronen Dinge aus, ohne auf die. – SLaks
Sie müssen die Grundlagen von async lernen. Lesen Sie https://msdn.microsoft.com/en-us/magazine/jj991977.aspx – SLaks
@SLaks -> Also, wie würden Sie gehen im Wesentlichen mehrere Aufgaben parallel in einem einzigen Prozess wie folgt durchführen? – user2231663