Frage

Ich habe eine Anwendung, bei der eine Aktion eine Reihe von E-Mail auslöst gesendet werden. Die Anzahl der E-Mails ist variabel und kann überall von 10 bis 1000 pro Aktion .

sein

Ich will nicht, um die Anwendung zu hang , während die E-Mails gesendet (so ärgerlich der Benutzer) und möchten sie im Hintergrund senden.

Ich habe Themen nicht in der Vergangenheit so, deshalb habe ich Ihre Hilfe brauchen. Werden Sie erstellen Threads manuell oder ist dies ein guter Fall einen Threadpool zu benutzen? Ich mag diese Aufgabe möglichst niedrige Priorität und verwendet die geringste Menge an Ressourcen sein, weil ich nicht einmal, wenn die E-Mail-1 Stunde zu spät nichts dagegen.

Schätzen Sie Ihre Hilfe
Marko

War es hilfreich?

Lösung

Hier geht einen anderen Vorschlag ... Wenn Sie sind eine DB verwenden, erstellen Sie eine neue Aufgabe (dh eine Tabelle erstellen, die eine Aufgabe zu tun darstellt) mit den Nachrichten verbunden, dass Bedarf gesendet und Verwendung Quartz.NET oder ähnlich (Sie einen Windows-Dienst erstellen kann), dass sieht für unerledigte Aufgaben und führt sie aus (markiert sie wie im Fall getan werden sie erfolgreich ausgeführt).

Andere Tipps

Ehrlich gesagt, in ASP.NET Threading ist keine gute Idee. Asp.net tut viel für die Entsorgung von Ressourcen, wenn eine Anforderung Enden und Beiträge an den Benutzer zurück. Da Sie zu warten, den Benutzer nicht wollen, werden Sie in diesem Szenario ausführen, wo ASP.NET-Objekte denken Sie sicher zu verwenden sind, sind wirklich angeordnet sind.

Ihre beste Möglichkeit ist, einen externen Service (entweder ein WCF-Dienst läuft in IIS oder ein Windows-Dienst, der eine wcf Schnittstelle ausgesetzt) ??zu schaffen, die die .net Seite asynchron aufrufen können, und haben diesen Antrag laufen, bis er abgeschlossen ist. Keine Sorgen um Threading usw. Es läuft seinen eigenen Prozess in und wenn es fertig ist es vervollständigt. Da Sie nicht über den Benutzer erklärt, ist es egal, das erledigt ist, müssen Sie sich keine Sorgen machen darüber Kommunikation zurück. Auf diese Weise zu, wenn Sie eine andere Seite verwendet die gleiche Service-Schnittstelle haben, ist es dort aufgerufen werden.

Seiten auf mit WCF den ersten Schritten:

http://bloggingabout.net /blogs/dennis/archive/2007/04/20/wcf-simple-example.aspx

http://msdn.microsoft.com/en-us/library /bb332338.aspx

http://www.c-sharpcorner.com /Articles/ArticleListing.aspx?SectionID=1&SubSectionID=192

Wie mithilfe von WCF / WPF starten?

So ist mein Vorschlag Threadpool zu verwenden. Es würde dir erlauben, alles statt zu Schlange stehen separat jeden von ihnen zu laufen, sie verbrauchen weniger Ressourcen zu machen, aber natürlich dauert länger zu verarbeiten alles, aber wie Sie gesagt haben, die Zeit ist kein Problem.

Sie könnten einfach verwenden, um die Background Klasse.

Die verknüpfte MSDN-Seite hat ein schönes Beispiel mit dem Fortschritt Berichterstattung und die Möglichkeit, den Vorgang abzubrechen.

Bearbeiten
Fortschrittsberichte und Löschung möglicherweise nicht in einer Web-Anwendung geeignet sein, aber die Background kümmert sich um alle die schmutzige Sachen mit einem Gewinde für Sie zu schaffen.

Edit2:
Wenn Sie viele E-Mails parallel senden möchten, können Sie das Aussehen der Aufgabe Parallel Library .

Sie könnten Aufgaben verwenden, um den Worker-Thread Laichen aus den E-Mail zu verarbeiten.

Ist dies der CPU zu viel Hämmern, können Sie einen neuen Scheduler erstellen, die die Parallelität reduziert: http://msdn.microsoft.com/en-us/library/ee789351.aspx

static void StartMailTasks(string[] addresses)
{
    List<Task> tasks = new List<Task>();
    foreach (var address in addresses)
    {
        tasks.Add(Task.Factory.StartNew(Email, address));
    }

    Task.Factory.ContinueWhenAll(tasks.ToArray(), AllDone, TaskContinuationOptions.OnlyOnRanToCompletion);
    Task.Factory.ContinueWhenAny(tasks.ToArray(), ReportError, TaskContinuationOptions.OnlyOnFaulted);
}

static void AllDone(Task[] tasks)
{
    // All is well
}

static void ReportError(Task errorTask)
{
    // Log or report the error
}

static void Email(object state )
{
    // send the e-mail  
    // Can throw error, if needed
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top