Aufgabe oder Thread für die Blockierung der VerarbeitungC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Aufgabe oder Thread für die Blockierung der Verarbeitung

Post by Anonymous »

Ich habe gegoogelt und habe mir die ähnlichen Fragen hier angesehen und ich kann einfach keine klare Antwort finden. Mein Problem sind alle Beispiele für die Blockierung der Sammlung scheinen langlebige oder asynchronisierte. Tut mir leid, wenn dies beantwortet wurde, aber ich habe nichts gefunden, das es mir erklären kann. Diese Jobs werden verarbeitet und können schnell sein oder Minuten dauern. Aber ich brauche etwas, das diese BlockingCollection blockiert und die gesamte Lebensdauer des Prozesses lebt. Ich habe versucht, Verbesserungen zu machen, in denen ich mit Aufgaben umgehe, was dazu führte, dass ich den Prozess method async erstellt habe. Dann begann ich in "StartNew Bad" -Diskussionen und was mir unvollständige Informationen erscheint. < /P>
Hier ist ein Beispiel für das, was ich tue.

Code: Select all

private BlockingCollection _queue;

void Main()
{
var cts = new CancellationTokenSource();
var ct = cts.Token;
_queue = new BlockingCollection();

// Simulate the addition of Jobs
Task.Run(() => { while (!ct.IsCancellationRequested) { _queue.Add(new Job()); Thread.Sleep(1000); }});

// Start the processing ta... thr... whatever
Task.Factory.StartNew(() => ProcessJobs(ct), TaskCreationOptions.LongRunning);

Console.Read();
cts.Cancel();
_queue.CompleteAdding();
}

private async Task ProcessJobs(CancellationToken ct)
{
foreach (var job in _queue.GetConsumingEnumerable(ct))
{
try
{
var result = await job.Process();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine("Job Processed.");
}
}

public class Job
{
public async Task Process()
{
// await network communication
await Task.Run(() => Thread.Sleep(100));
return true;
}
}
Mein Anliegen ist, dass ich diese Task.factory.StartNew mit asynchronisierten Methoden gelesen habe, wie der erste Teil Ihres Code, der auf dem, was er für ihn erstellt hat, aber sobald Sie auf ein Warten drücken. Dass Sie Task.run .
meine Frage verwenden, wie soll ich Prozessjobs ausführen? Halten Sie den StartNew ? Task.run ? neuer Thread (processJobs) ?

Code: Select all

ProcessJobs
muss für die Lebensdauer der App fortgesetzt werden. Es wird nur storniert und die Warteschlange Comreeadding () Wenn die App abgerissen wird. Diese Verarbeitung ist die Hauptfunktion der App. Während es möglicherweise Perioden gibt, in denen keine Jobs hinzugefügt werden, wird es wahrscheinlich Perioden geben, in denen die Prozessmethode nicht darauf warten muss, dass neue Elemente hinzugefügt werden. Fragen nach einer asynchronen Blockierungssammlung; Diese andere Frage hat in keiner Weise geholfen. Ich frage Thread , task.run oder task.factory.startNew . Auch wenn ich einen der Vorschläge aus verwenden würde, gibt es so etwas wie asynchrone BlockingCollection ? Ich würde immer noch einen Thread oder Aufgabe benötigen, der beim Warten auf die Eingabe blockiert werden kann. Wenn ich sage, dass diese Verarbeitung die primäre Funktion ist, meinte ich nicht, dass es die einzige Funktion war und der gesamte Prozess blockieren könnte.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post