Frage

Aus irgendeinem Grund ThreadPool der QueueWorkItem kehrt nicht ein IAsyncResult oder einen anderen Griff in die Arbeitsposition, die warten erlauben würde, bis es fertig ist. Es gibt RegisterWait... Methoden, aber Sie haben eine WaitHandle passieren und sie schaffen, ist teuer (siehe IAsyncResult Dokumentation, die Ihnen eine WaitHandle zu verzögern rät zu schaffen, bis gewünscht). Die Task Parallel Library wird diesen Mangel beheben, aber es gibt eine lange Wartezeit, bevor das ist verfügbar. So gibt es irgendwelche Probleme mit diesem Entwurf:

public class Concurrent<T> {
    private ManualResetEvent _resetEvent;
    private T _result;

    public Concurrent(Func<T> f) {
        ThreadPool.QueueUserWorkItem(_ => {
                                         _result = f();
                                         if (_resetEvent != null)
                                             _resetEvent.Set();
                                     });
    }

    public WaitHandle WaitHandle {
        get {
            if (_resetEvent == null)
                _resetEvent = new ManualResetEvent(_result != null);
            return _resetEvent;
        }

    ...

EDIT: Ich fragte einen Follow-up-Frage zu den Bedenken die entstehen, wenn Asynchron-Delegierten anstelle des Thread verwendet wird.

War es hilfreich?

Lösung

Nun, haben Sie eine Race-Bedingung bekommen die Waithandle zwischen Abholen und Einstellung. Wollen Sie wirklich der Anrufer zu warten, für immer wollen, wenn sie ein kleines bisschen spät geschehen sein?

Sie sollten wahrscheinlich eine entsprechende Verriegelung tun und halten ein „ich fertig bin“ Flagge, so dass, wenn Sie tun erstellen die Waithandle nachdem es fertig ist, können Sie es einstellen, bevor es zurück.

Ich würde auch persönlich eine statische Factory-Methode schreiben, anstatt nur einen öffentlichen Konstruktor - oder es machen „erstellen und und explizit starten“ -Muster. Queuing das Workitem im Konstruktor fühlt sich komisch für mich.

Andere Tipps

Warum sind Sie nicht einen asynchronen Delegaten verwenden, wie hier demostrated:

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

Das würde Concurrent veraltet, nicht wahr?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top