Blogs / FastAPI BackgroundTasks vs. Celery: Wann was verwenden

FastAPI BackgroundTasks vs. Celery: Wann was verwenden

Veröffentlicht
27. August 2026
Autor
Faizan Nadeem
Tags
FastAPI Python Celery Backend Development
Metallkomponenten bewegen sich auf einem industriellen Förderband in einer Fabrikmontagelinie
Foto von Salvador Escalante auf Unsplash

BackgroundTasks sieht so aus, als wĂŒrde es dasselbe Problem lösen wie Celery — Arbeit ausfĂŒhren, nachdem die Response rausgegangen ist, ohne dass der Nutzer darauf warten muss. Es ist in FastAPI eingebaut, braucht keine zusĂ€tzliche Infrastruktur, und der Code dafĂŒr ist drei Zeilen lang. Genau diese Einfachheit ist der Grund, warum Teams dazu greifen, um BestĂ€tigungs-E-Mails zu senden, die Erstellung eines Reports anzustoßen oder einen Audit-Log-Eintrag zu schreiben. Und es funktioniert — bis mitten in einem Request ein Deploy lĂ€uft, oder der Prozess per OOM-Kill beendet wird, oder der Pod-Autoscaler entscheidet, eine Instanz zu terminieren — und die Aufgabe, die „im Hintergrund“ lief, schlicht nie stattfindet, ohne Fehler, ohne Retry und ohne irgendeinen Hinweis darauf, dass sie jemals hĂ€tte ausgefĂŒhrt werden sollen.

Dieser Ausfallmodus ist kein BackgroundTasks-Bug. Es ist BackgroundTasks, das genau das tut, wofĂŒr es entworfen wurde — eine Coroutine im selben Prozess nach der Response ausfĂŒhren, ohne Persistenzschicht dahinter. Der eigentliche Fehler ist, es fĂŒr Arbeit zu verwenden, die Garantien benötigt, die nur eine echte Task-Queue bietet. Dieser Beitrag erklĂ€rt, was BackgroundTasks tatsĂ€chlich ist, unter welchen konkreten Bedingungen es Arbeit stillschweigend verliert, was Celery hinzufĂŒgt, um das zu beheben, und ein konkretes Framework, um zwischen beiden zu wĂ€hlen, statt einfach standardmĂ€ĂŸig das zu nehmen, was man zuerst eingerichtet hat.

Sie lernen:

  • Was BackgroundTasks unter der Haube tatsĂ€chlich macht und warum es im selben Prozess wie der Request lĂ€uft
  • Die konkreten Fehlerszenarien — Deploys, Crashes, Autoscaling — in denen BackgroundTasks stillschweigend Arbeit verliert
  • Was Celery strukturell hinzufĂŒgt: einen Broker, Persistenz, Retries und unabhĂ€ngige Worker-Prozesse
  • Ein Entscheidungsframework basierend auf Durability-Anforderungen, Retry-Bedarf und erwarteter Task-Dauer
  • Wie man beide kombiniert — BackgroundTasks fĂŒr wirkliches Fire-and-forget, Celery fĂŒr alles, was eine Garantie braucht
  • FunktionsfĂ€higen Code fĂŒr beides, einschließlich einer Celery-Retry-Policy und eines FastAPI-Endpoints, der dorthin dispatcht

Inhaltsverzeichnis

  1. Die Grundlagen
  2. Wie BackgroundTasks tatsÀchlich funktioniert
  3. Wo BackgroundTasks stillschweigend Arbeit verliert
  4. Was Celery hinzufĂŒgt
  5. Das Entscheidungsframework
  6. Hybride Muster
  7. Codebeispiele
  8. Leichtgewichtigere Alternativen zu Celery
  9. HĂ€ufige Fallstricke
  10. Best Practices fĂŒr Produktion

Die Grundlagen

Zwei unterschiedliche Werkzeuge fĂŒr zwei unterschiedliche Probleme

BackgroundTasks ist ein Starlette-Feature, das FastAPI direkt bereitstellt: eine Möglichkeit, eine Funktion so zu planen, dass sie nach dem Senden der HTTP-Response innerhalb desselben Worker-Prozesses ausgefĂŒhrt wird, der den Request bearbeitet hat. Celery ist eine verteilte Task-Queue: ein separates System mit eigenen Worker-Prozessen, einem Message-Broker (typischerweise Redis oder RabbitMQ) zwischen Ihrer App und diesen Workern sowie einem Results-/State-Backend, das einen Neustart des App-Prozesses ĂŒberlebt.

Die Ähnlichkeit auf oberflĂ€chlicher Ebene — „spĂ€ter ausfĂŒhren, die Response nicht blockieren“ — verdeckt einen viel grĂ¶ĂŸeren strukturellen Unterschied: BackgroundTasks hat ĂŒberhaupt keine Persistenzschicht. Wenn der Prozess, der die Task geplant hat, stirbt, bevor die Task fertig ist, ist die Task weg. Der Broker von Celery persistiert die Task in dem Moment, in dem sie enqueued wird, unabhĂ€ngig davon, ob Ihr API-Prozess ĂŒberhaupt noch lĂ€uft, wenn ein Worker sie abholt.

Warum diese Unterscheidung oft ĂŒbersehen wird

Die meisten Tutorials fĂŒhren BackgroundTasks mit echten Fire-and-forget-Beispielen ein — Logging, Cache-Warming — bei denen der gelegentliche Verlust einer Task harmlos ist. Teams verwenden dann dasselbe Muster erneut fĂŒr Dinge, deren Verlust nicht harmlos ist: das Senden einer Passwort-Reset-E-Mail, das Abbuchen einer Zahlung, das Erzeugen eines Dokuments, auf das ein Nutzer wartet. Die API sieht in beiden FĂ€llen identisch aus. Die Konsequenz eines Fehlers nicht.

Wie BackgroundTasks tatsÀchlich funktioniert

Ein BackgroundTasks-Objekt wird in eine Route injiziert, Funktionen werden darauf registriert, und FastAPI fĂŒhrt sie aus, nachdem die Response gesendet wurde — aber weiterhin innerhalb desselben asynchronen Event-Loops und desselben Worker-Prozesses:

from fastapi import FastAPI, BackgroundTasks

app = FastAPI()

def send_confirmation_email(email: str):
    # runs after the response has already gone out
    email_client.send(email, "Thanks for signing up")

@app.post("/signup")
async def signup(email: str, background_tasks: BackgroundTasks):
    create_user(email)
    background_tasks.add_task(send_confirmation_email, email)
    return {"status": "created"}

Der Nutzer erhĂ€lt seine Response in dem Moment, in dem create_user fertig ist — auf send_confirmation_email wartet er ĂŒberhaupt nicht. Das ist das gesamte Wertversprechen, und es ist wirklich nĂŒtzlich. Aber beachten Sie, was nicht passiert: Es gibt keine Queue, keinen Broker, keinen separaten Worker und nichts, was verfolgt, ob send_confirmation_email jemals tatsĂ€chlich abgeschlossen wurde. Es ist ein geplanter Coroutine-Aufruf innerhalb desselben Prozesslebenszyklus wie der Request, der ihn ausgelöst hat — nĂ€her an asyncio.create_task mit etwas angenehmerer Ergonomie als an irgendetwas, das einer Job-Queue Ă€hnelt.

Wenn send_confirmation_email selbst synchron und blockierend ist, lĂ€uft es außerdem innerhalb derselben Threadpool- oder Event-Loop-BeschrĂ€nkungen, die in Warum Ihr FastAPI-Endpoint den Event Loop blockiert beschrieben werden — eine langsame Hintergrund-Task kann den Durchsatz des restlichen Prozesses also weiterhin verschlechtern, wenn sie nicht so geschrieben ist, dass sie mit dem Loop kooperiert. Eine synchrone Funktion, die mit add_task registriert wird, lĂ€uft im Threadpool von Starlette genau wie eine def-Route, wĂ€hrend eine async def-Funktion, die auf dieselbe Weise registriert wird, direkt auf dem Event Loop lĂ€uft — daher kann eine Hintergrund-Task, die blockiert, ohne zu awaiten, laufende Requests ausbremsen, nicht nur andere Hintergrundarbeit. Das ĂŒbersieht man leicht, gerade weil die Task auf den ersten Blick vom Request-/Response-Zyklus entkoppelt aussieht.

Auch das Exception-Handling lĂ€sst sich leicht falsch einschĂ€tzen. Wenn eine registrierte Task eine Exception wirft, lĂ€sst FastAPI die Response nicht crashen — sie wurde bereits gesendet — aber standardmĂ€ĂŸig ist die Exception nur sichtbar, wenn Ihr Logging unhandled Exceptions aus Hintergrund-Tasks gezielt erfasst; ein bloßes try/except um die Route selbst sieht sie nie, weil die Route-Funktion bereits zurĂŒckgegeben hat, wenn die Task lĂ€uft.

Wo BackgroundTasks stillschweigend Arbeit verliert

Jeder dieser FĂ€lle ist ein normales, erwartbares Ereignis in einem Produktions-Deployment — kein Randfall:

Deploys. Ein Rolling Deploy sendet SIGTERM an den alten Prozess. Wenn eine Hintergrund-Task gerade lĂ€uft (oder noch nicht gestartet hat, weil sie hinter anderer Arbeit im selben Event Loop ansteht), wenn das Grace-Period-Fenster des Prozesses ablĂ€uft und er per SIGKILL beendet wird, ist diese Task dauerhaft weg, ohne dass irgendetwas darĂŒber geloggt wurde.

Scale-down durch Autoscaling. Derselbe Mechanismus wie bei einem Deploy — ein Orchestrator (Kubernetes, ECS) entscheidet, eine Instanz bei geringer Last zu terminieren, und jede BackgroundTasks-Arbeit, die auf dieser Instanz lĂ€uft, verschwindet mit ihr.

Prozess-Crashes und OOM-Kills. Ein nicht zusammenhĂ€ngendes Memory Leak oder ein unerwartet großer Request an anderer Stelle im selben Prozess kann dazu fĂŒhren, dass der gesamte Worker per OOM-Kill beendet wird und alle ausstehenden Hintergrund-Tasks mitnimmt — sogar Tasks, die nichts mit der Ursache des Crashes zu tun hatten.

Kein Retry bei Fehlern. Wenn send_confirmation_email eine Exception wirft — etwa weil der E-Mail-Provider in ein Timeout lĂ€uft — retried BackgroundTasks sie nicht. StandardmĂ€ĂŸig wird die Exception geschluckt (sichtbar nur, wenn Sie Exception-Logging dafĂŒr verdrahtet haben), und die Task wird schlicht nie abgeschlossen. Es gibt keine Dead-Letter-Queue, kein Backoff, keinen zweiten Versuch.

Keine prozessĂŒbergreifende Sichtbarkeit. Wenn Sie mehrere Uvicorn-/Gunicorn-Worker betreiben, hat ein BackgroundTasks-Job, der auf Worker 2 geplant wurde, keinerlei Beziehung zu Worker 1 — Sie können ihn nirgends inspizieren, retrien oder abbrechen außer in genau dem Prozess, der ihn geplant hat, und die Logs dieses Prozesses sind der einzige Nachweis dafĂŒr, dass er existierte.

Nichts davon macht BackgroundTasks kaputt. Es macht es zu einem Werkzeug fĂŒr Arbeit, deren gelegentlichen Verlust Sie sich tatsĂ€chlich leisten können — nicht zu einer Allzweck-Job-Queue mit einfacherer API.

Was Celery hinzufĂŒgt

Die Architektur von Celery beantwortet direkt jede der obigen LĂŒcken, indem sie eine dauerhafte, unabhĂ€ngige Schicht zwischen „dem Request, der die Arbeit ausgelöst hat“ und „dem Prozess, der die Arbeit ausfĂŒhrt“ einzieht:

  • Einen Message-Broker (Redis/RabbitMQ), der die Task persistiert. In dem Moment, in dem .delay() aufgerufen wird, wird die Task serialisiert und in den Broker geschrieben — unabhĂ€ngig vom Lebenszyklus des FastAPI-Prozesses. Wenn der API-Prozess eine Millisekunde spĂ€ter stirbt, ist die Task bereits sicher im Broker.
  • UnabhĂ€ngige Worker-Prozesse. Celery-Worker sind separate Prozesse (oft sogar separate Container oder Hosts), die Tasks aus dem Broker ziehen. Ein Deploy Ihrer API betrifft sie nicht; ein Deploy Ihrer Worker betrifft Ihre API nicht.
  • Eingebaute Retries mit Backoff. Eine Task kann max_retries und eine Backoff-Policy deklarieren, sodass ein transienter Fehler — etwa eine kurzzeitig nicht verfĂŒgbare Downstream-API — automatisch erneut versucht wird, statt stillschweigend zu sterben.
  • Ein Results-Backend. Der Zustand einer Task (pending, success, failure und der Return-Value) ist nachtrĂ€glich von jedem Prozess aus abfragbar, wodurch „wurde das tatsĂ€chlich abgeschlossen?“ zu einer beantwortbaren Frage wird statt zu einer Übung im Log-Durchsuchen.
  • Scheduling und Rate Limiting. Periodische Tasks (celery beat), Rate Limits pro Task-Typ und PrioritĂ€ts-Queues sind First-Class-Features und nicht etwas, das Sie auf BackgroundTasks von Hand aufbauen mĂŒssten.

Der Trade-off ist echte Infrastruktur: ein Broker, den man betreiben und ĂŒberwachen muss, Worker-Prozesse, die unabhĂ€ngig deployt und skaliert werden mĂŒssen, und ein tatsĂ€chlich komplexeres mentales Modell — Task-Serialisierung, Idempotenz und Broker-Connection-Handling sind jetzt auf eine Weise Ihr Problem, wie sie es bei BackgroundTasks nicht waren.

Das Entscheidungsframework

Drei Fragen entscheiden fast jeden Fall:

1. Können Sie es sich leisten, diese Task vollstÀndig und stillschweigend zu verlieren, ohne Retry?
Wenn ja — ein Metrics-Ping, ein Best-Effort-Cache-Warm, ein Analytics-Event — dann ist BackgroundTasks in Ordnung, und Celery hinzuzufĂŒgen wĂ€re reiner Overhead. Wenn nein — alles, was mit Geld zu tun hat, alles, auf dessen Ergebnis ein Nutzer ausdrĂŒcklich wartet, alles mit Compliance- oder Audit-Anforderung — dann brauchen Sie die Durability von Celery.

2. Muss die Task ein Deploy oder ein Scale-down-Ereignis ĂŒberleben?
BackgroundTasks-Arbeit ĂŒberlebt nur, wenn der Prozess, der sie geplant hat, lange genug am Leben bleibt, um sie zu beenden. Wenn Sie hĂ€ufig deployen (mehrmals tĂ€glich, wie bei CI/CD ĂŒblich) und Tasks lĂ€nger laufen können als Ihr Graceful-Shutdown-Fenster, dann verliert BackgroundTasks Arbeit in vorhersehbarer RegelmĂ€ĂŸigkeit und nicht nur selten.

3. Braucht die Task eine Retry-Policy, Scheduling oder prozessĂŒbergreifende Sichtbarkeit?
Wenn ein Fehler automatisch retried werden muss, wenn die Task nach einem Zeitplan unabhĂ€ngig von Requests laufen soll oder wenn Sie den Task-Status aus einem anderen Prozess heraus prĂŒfen mĂŒssen (ein Admin-Dashboard, eine separate API), dann sind genau dafĂŒr Broker und Results-Backend von Celery da — BackgroundTasks hat fĂŒr keinen dieser drei Punkte einen Mechanismus.

SignalBackgroundTasksCelery
Task-DauerSekunden, nicht MinutenSekunden bis Stunden
VerlusttoleranzVollstÀndig tolerantBraucht Durability
Retry bei FehlernNichts eingebautEingebaut, mit Backoff
Überlebt ProzessneustartNeinJa
ProzessĂŒbergreifende SichtbarkeitNeinJa (Results-Backend)
Erforderliche InfrastrukturKeineBroker + Worker-Prozesse
Scheduling (cron-artig)NeinJa (celery beat)

Hybride Muster

Die meisten reifen FastAPI-Codebasen verwenden bewusst beides, statt ein Werkzeug fĂŒr die gesamte App auszuwĂ€hlen. Eine gĂ€ngige und effektive Aufteilung: BackgroundTasks fĂŒr Arbeit verwenden, die billig zu wiederholen oder wirklich entbehrlich ist, und fĂŒr alles mit Durability- oder Retry-Anforderung an Celery dispatchen — oft sogar aus demselben Endpoint.

@app.post("/orders")
async def create_order(payload: OrderCreate, background_tasks: BackgroundTasks):
    order = await create_order_record(payload)

    # Disposable — fine to lose occasionally, no retry needed
    background_tasks.add_task(log_analytics_event, "order_created", order.id)

    # Durable — must survive a deploy, needs a retry policy
    send_order_confirmation.delay(order.id)

    return order

Die Faustregel: Wenn es Sie in einem Post-mortem verĂ€rgern wĂŒrde festzustellen, dass eine Task stillschweigend nie gelaufen ist, dann gehört sie in Celery. Wenn Sie nur mit den Schultern zucken wĂŒrden, ist BackgroundTasks genau das richtige Maß an Tooling.

Codebeispiele

Ein minimales Celery-Setup, das das obige Framework widerspiegelt — Retries mit exponentiellem Backoff fĂŒr eine wirklich wichtige Task:

# celery_app.py
from celery import Celery

celery_app = Celery(
    "worker",
    broker="redis://localhost:6379/0",
    backend="redis://localhost:6379/1",
)

@celery_app.task(
    bind=True,
    max_retries=5,
    default_retry_delay=10,  # seconds, before backoff kicks in
)
def send_order_confirmation(self, order_id: int):
    try:
        order = fetch_order(order_id)
        email_client.send(order.customer_email, render_receipt(order))
    except EmailProviderTimeout as exc:
        # exponential-ish backoff: 10s, 20s, 40s...
        raise self.retry(exc=exc, countdown=10 * (2 ** self.request.retries))
# app/orders/router.py
from app.workers.celery_app import send_order_confirmation

@router.post("/")
async def create_order_endpoint(payload: OrderCreate):
    order = await create_order(payload)
    send_order_confirmation.delay(order.id)
    return order

.delay(order.id) kehrt sofort zurĂŒck — es stellt die Task nur im Broker ein — daher bleibt die Response-Zeit des Endpoints unbeeinflusst, wĂ€hrend die eigentliche Abschlussgarantie jetzt im Broker und in der Retry-Policy von Celery lebt und nicht mehr im FastAPI-Prozess. Diese Art von Modulgrenze — ein workers/-Package, in das der Router dispatcht, ohne dessen Interna zu besitzen — passt natĂŒrlich zu dem Domain-driven-Layout aus FastAPI-Projektstruktur, die Wachstum ĂŒberlebt.

Leichtgewichtigere Alternativen zu Celery

Celery ist nicht die einzige durable Option, und fĂŒr eine Async-first-FastAPI-Codebasis ist es oft nicht die natĂŒrlichste Wahl — das Worker-Modell von Celery stammt aus der Zeit vor asyncio und behandelt Async-Tasks eher als nachtrĂ€glich angeschraubtes Feature denn als First-Class-Design.

arq ist eine Redis-gestĂŒtzte Queue, die speziell von Grund auf fĂŒr asyncio gebaut wurde. Task-Funktionen sind async def, Worker betreiben ihren eigenen Event Loop, und es gibt keine BrĂŒcke von synchron nach async, ĂŒber die man nachdenken mĂŒsste:

# worker.py
async def send_order_confirmation(ctx, order_id: int):
    order = await fetch_order(order_id)
    await email_client.send_async(order.customer_email, render_receipt(order))

class WorkerSettings:
    functions = [send_order_confirmation]
    redis_settings = RedisSettings(host="localhost")
# dispatching from FastAPI
redis = await create_pool(RedisSettings(host="localhost"))
await redis.enqueue_job("send_order_confirmation", order.id)

Dramatiq und RQ liegen in einem Ă€hnlichen Bereich — einfacheres Setup als Celery, Redis als Broker und eine kleinere Feature-OberflĂ€che (zum Beispiel kein celery beat-Ă€quivalentes Scheduling im Core von RQ) im Austausch fĂŒr weniger operativen Overhead.

Das obige Entscheidungsframework gilt weiterhin, egal welche durable Queue Sie wĂ€hlen — die Frage war nie konkret „Celery oder nichts“, sondern „braucht diese Task ĂŒberhaupt Broker-gestĂŒtzte Durability“. Celery bleibt die richtige Standardwahl, wenn Sie sein Ökosystem brauchen — reifes Scheduling sowie Routing- und Monitoring-Tooling, zu dem die neueren Alternativen noch aufschließen — aber fĂŒr einen Greenfield-Async-FastAPI-Service lohnt es sich, arq zuerst zu evaluieren, gerade weil es vermeidet, einen Sync-first-Task-Runner in eine ansonsten Async-first-Codebasis zu mischen.

HĂ€ufige Fallstricke

Fehler: BackgroundTasks fĂŒr alles zu verwenden, was mit Zahlung oder Compliance zu tun hat. Eine stillschweigend verlorene ZahlungsbestĂ€tigung oder ein Audit-Log-Eintrag ist ein GeschĂ€ftsproblem, keine technische Unannehmlichkeit. Lösung: Alles mit rechtlicher, finanzieller oder Audit-Anforderung lĂ€uft ĂŒber Celery, ohne Ausnahmen.

Fehler: anzunehmen, dass Celery-Tasks automatisch idempotent sind. Eine retried Task fĂŒhrt die gesamte Funktion erneut aus — wenn send_order_confirmation nicht sicher zweimal laufen kann, kann ein Retry nach einem teilweisen Fehler doppelt senden. Lösung: Tasks idempotent entwerfen (check-before-act oder Idempotency Keys verwenden), wann immer Retries aktiviert sind.

Fehler: wirklich lang laufende Arbeit in BackgroundTasks zu legen. Eine Task, die minutenlang im selben Prozess wie Ihre API-Worker lĂ€uft, konkurriert um dieselben Ressourcen wie die Request-Verarbeitung. Lösung: Alles ĂŒber ein paar Sekunden hinaus gehört in einen separaten Worker-Pool — genau das stellt Celery bereit.

Fehler: Celery fĂŒr eine einzelne, unkritische Task aufzubauen. Die Betriebskosten eines Brokers und einer Worker-Flotte rechtfertigen keinen einzelnen Best-Effort-Analytics-Call. Lösung: StandardmĂ€ĂŸig BackgroundTasks verwenden, bis eine konkrete Durability- oder Retry-Anforderung auftaucht.

Fehler: den Gesundheitszustand von Celery-Workern nicht zu ĂŒberwachen. Eine abgestĂŒrzte oder ĂŒberlastete Worker-Flotte akkumuliert stillschweigend einen wachsenden Backlog ohne sichtbares Symptom fĂŒr Nutzer, bis es gravierend wird. Lösung: Queue-Tiefe und Worker-Liveness (Flower oder die Celery-Integration Ihres APM) als First-Class-Produktionsmetriken ĂŒberwachen.

Best Practices fĂŒr Produktion

  • StandardmĂ€ĂŸig BackgroundTasks verwenden und bewusst upgraden. Keine Celery-Infrastruktur aufbauen, bevor eine konkrete Task tatsĂ€chlich die Garantien benötigt, die Celery bietet.
  • Celery-Tasks standardmĂ€ĂŸig idempotent machen. Gehen Sie davon aus, dass jede Task mindestens einmal retried wird, denn irgendwann wird sie das.
  • Explizite Retry-Limits und Backoff setzen, niemals unbegrenzte Retries. Eine Task, die fĂŒr immer gegen eine dauerhaft kaputte AbhĂ€ngigkeit retried, wird nur zu einer anderen Art von Incident.
  • Task-Dispatch und Abschluss getrennt loggen. Zu wissen, dass eine Task geplant wurde, ist nicht dasselbe wie zu wissen, dass sie erfolgreich war — instrumentieren Sie beides.
  • Queue-Tiefe als alarmierbare Metrik behandeln. Ein wachsender, unverarbeiteter Celery-Backlog ist eines der frĂŒhesten Signale fĂŒr einen Ausfall in einem Downstream-System.

Fazit

BackgroundTasks und Celery sind keine konkurrierenden Lösungen fĂŒr dasselbe Problem — sie sind das richtige Werkzeug fĂŒr zwei wirklich unterschiedliche Durability-Anforderungen, und der Fehler besteht darin, nach Einrichtungsaufwand zu entscheiden statt danach, was passiert, wenn mitten in einer Task ein Deploy landet. Wenn der stille Verlust der Arbeit ein echtes Problem wĂ€re, dann ist das Ihre Antwort, egal wie viel einfacher BackgroundTasks heute aussieht. Die meisten FastAPI-Apps in Produktion verwenden am Ende bewusst beides, sobald sie genau einmal zu oft von einer verlorenen Task gebrannt wurden.

Wissen Sie tatsÀchlich, was mit Ihren laufenden Hintergrund-Tasks passiert, wenn Sie das nÀchste Mal deployen?

Weitere Artikel