Mam ten kod, który chcę, czego chcę:

        TriggerSomeExternalProcess();
        double secondsElapsed = 0;
        DateTime startTime = DateTime.UtcNow;
        double timeoutInSeconds = 10;
        while (secondsElapsed < timeoutInSeconds) {
            // TODO: this seems bad...
            secondsElapsed = DateTime.UtcNow.Subtract(startTime).TotalSeconds;
        }
        CheckStatusOfExternalProcess();

Celem jest TriggerSomeExternalProcess, a następnie CheckStatusOfSomeExternalProcess - ale ten proces działa na tym samym wątku, więc nie mogę zrobić Thread.Sleep(). To ciągły proces, którego nie można oczekiwać.

Czuję się jak pętla powyżej {x0}} jest nie tak - jaki wzór zatrudniasz, gdy musisz czekać bez blokowania wątku?

kopiuj wklejony z komentarza na jednej z odpowiedzi Niestety nie mogę dotknąć kodu w zewnętrznej stronie. Piszę test i są to metody, do których mam dostęp. Wiem, że jest mniej niż idealny

2
SB2055 16 luty 2017, 20:37

2 odpowiedzi

Najlepsza odpowiedź

Zamiast stosować metodę CheckStatusofexternalProcess (), może być w stanie dodać statussangedEvent na zewnętrznej stronie i dołączyć do niej Eventhandler. W ten sposób twój eventhandler zostaje wywołany, gdy status się zmienił.

Czy to możliwość dla ciebie?

BTW: Jeśli oba twoje procesy działają na tym samym wątku - jak może to nie blokować?

2
Tobias Theel 16 luty 2017, 17:41

Zakładam, że proces zewnętrzny nie jest twoim własnym. Dlatego nie może wziąć działania zwrotnego. Nie może dać bicia serca (wyślij okresowo z powrotem swojego aktualnego statusu). I nie może subskrybować, że jest to zmiana statusu. Byłyby to normalne sposoby radzenia sobie z tym.

W takim przypadku możesz po prostu użyć czegoś takiego

Task.delay(TimeSpan.FromSeconds(10))).ContinueWith(() => CheckStatusOfExternalProcess())

Kontynuuj z ogniem, gdy wkrótce pierwszy zadanie jest kompletne, ale teraz możesz kontynuować w swoim kodzie, nie martwiąc się o to

0
Noah Reinagel 20 luty 2017, 16:33