# Buggy code
def async_task(self, func):
    """
    Execute handler as task and return None.
    Use this decorator for slow handlers (with timeouts)

    .. code-block:: python3

        @dp.message_handler(commands=['command'])
        @dp.async_task
        async def cmd_with_timeout(message: types.Message):
            await asyncio.sleep(120)
            return SendMessage(message.chat.id, 'KABOOM').reply(message)

    :param func:
    :return:
    """

    def process_response(task):
        try:
            response = task.result()
        except Exception as e:
            self.loop.create_task(
                self.errors_handlers.notify(types.Update.get_current(), e)
            )
        else:
            if isinstance(response, BaseResponse):
                self.loop.create_task(response.execute_response(self.bot))

    @functools.wraps(func)
    async def wrapper(*args, **kwargs):
        task = self.loop.create_task(func(*args, **kwargs))
        task.add_done_callback(process_response)

    return wrapper


# Traceback (RuntimeError)
INFO:     91.108.6.40:0 - "POST /updates/ HTTP/1.1" 500 Internal Server Error
ERROR:    Exception in ASGI application
Traceback (most recent call last):
File "/home/vitaliy/.cache/pypoetry/virtualenvs/telegram-evernote-bot-IC7bT7Nj-py3.8/lib/python3.8/site-packages/uvicorn/protocols/http/httptools_impl.py", line 385, in run_asgi
result = await app(self.scope, self.receive, self.send)
File "/home/vitaliy/.cache/pypoetry/virtualenvs/telegram-evernote-bot-IC7bT7Nj-py3.8/lib/python3.8/site-packages/uvicorn/middleware/proxy_headers.py", line 45, in __call__
return await self.app(scope, receive, send)
File "/home/vitaliy/.cache/pypoetry/virtualenvs/telegram-evernote-bot-IC7bT7Nj-py3.8/lib/python3.8/site-packages/starlette/applications.py", line 102, in __call__
await self.middleware_stack(scope, receive, send)
File "/home/vitaliy/.cache/pypoetry/virtualenvs/telegram-evernote-bot-IC7bT7Nj-py3.8/lib/python3.8/site-packages/starlette/middleware/errors.py", line 181, in __call__
raise exc from None
File "/home/vitaliy/.cache/pypoetry/virtualenvs/telegram-evernote-bot-IC7bT7Nj-py3.8/lib/python3.8/site-packages/starlette/middleware/errors.py", line 159, in __call__
await self.app(scope, receive, _send)
File "/home/vitaliy/.cache/pypoetry/virtualenvs/telegram-evernote-bot-IC7bT7Nj-py3.8/lib/python3.8/site-packages/starlette/exceptions.py", line 82, in __call__
raise exc from None
File "/home/vitaliy/.cache/pypoetry/virtualenvs/telegram-evernote-bot-IC7bT7Nj-py3.8/lib/python3.8/site-packages/starlette/exceptions.py", line 71, in __call__
await self.app(scope, receive, sender)
File "/home/vitaliy/.cache/pypoetry/virtualenvs/telegram-evernote-bot-IC7bT7Nj-py3.8/lib/python3.8/site-packages/starlette/routing.py", line 550, in __call__
await route.handle(scope, receive, send)
File "/home/vitaliy/.cache/pypoetry/virtualenvs/telegram-evernote-bot-IC7bT7Nj-py3.8/lib/python3.8/site-packages/starlette/routing.py", line 227, in handle
await self.app(scope, receive, send)
File "/home/vitaliy/.cache/pypoetry/virtualenvs/telegram-evernote-bot-IC7bT7Nj-py3.8/lib/python3.8/site-packages/starlette/endpoints.py", line 30, in dispatch
response = await handler(request)
File "/home/vitaliy/coding/telegram-evernote-bot/src/views.py", line 57, in post
await process_update(update_data)
File "/home/vitaliy/coding/telegram-evernote-bot/src/services/updates.py", line 13, in process_update
return await dispatcher.process_update(update)
File "/home/vitaliy/.cache/pypoetry/virtualenvs/telegram-evernote-bot-IC7bT7Nj-py3.8/lib/python3.8/site-packages/aiogram/dispatcher/dispatcher.py", line 214, in process_update
return await self.message_handlers.notify(update.message)
File "/home/vitaliy/.cache/pypoetry/virtualenvs/telegram-evernote-bot-IC7bT7Nj-py3.8/lib/python3.8/site-packages/aiogram/dispatcher/handler.py", line 117, in notify
response = await handler_obj.handler(*args, **partial_data)
File "/home/vitaliy/coding/telegram-evernote-bot/src/bot.py", line 21, in send_help_message
await message.reply(
File "/home/vitaliy/.cache/pypoetry/virtualenvs/telegram-evernote-bot-IC7bT7Nj-py3.8/lib/python3.8/site-packages/aiogram/types/message.py", line 995, in reply
return await self.bot.send_message(
File "/home/vitaliy/.cache/pypoetry/virtualenvs/telegram-evernote-bot-IC7bT7Nj-py3.8/lib/python3.8/site-packages/aiogram/bot/bot.py", line 219, in send_message
result = await self.request(api.Methods.SEND_MESSAGE, payload)
File "/home/vitaliy/.cache/pypoetry/virtualenvs/telegram-evernote-bot-IC7bT7Nj-py3.8/lib/python3.8/site-packages/aiogram/bot/base.py", line 201, in request
return await api.make_request(self.session, self.__token, method, data, files,
File "/home/vitaliy/.cache/pypoetry/virtualenvs/telegram-evernote-bot-IC7bT7Nj-py3.8/lib/python3.8/site-packages/aiogram/bot/api.py", line 103, in make_request
async with session.post(url, data=req, **kwargs) as response:
File "/home/vitaliy/.cache/pypoetry/virtualenvs/telegram-evernote-bot-IC7bT7Nj-py3.8/lib/python3.8/site-packages/aiohttp/client.py", line 1012, in __aenter__
self._resp = await self._coro
File "/home/vitaliy/.cache/pypoetry/virtualenvs/telegram-evernote-bot-IC7bT7Nj-py3.8/lib/python3.8/site-packages/aiohttp/client.py", line 426, in _request
with timer:
File "/home/vitaliy/.cache/pypoetry/virtualenvs/telegram-evernote-bot-IC7bT7Nj-py3.8/lib/python3.8/site-packages/aiohttp/helpers.py", line 579, in __enter__
raise RuntimeError('Timeout context manager should be used '
RuntimeError: Timeout context manager should be used inside a task

# Fixed code
def async_task(self, func):
    """
    Execute handler as task and return None.
    Use this decorator for slow handlers (with timeouts)

    .. code-block:: python3

        @dp.message_handler(commands=['command'])
        @dp.async_task
        async def cmd_with_timeout(message: types.Message):
            await asyncio.sleep(120)
            return SendMessage(message.chat.id, 'KABOOM').reply(message)

    :param func:
    :return:
    """

    def process_response(task):
        try:
            response = task.result()
        except Exception as e:
            self._loop_create_task(
                self.errors_handlers.notify(types.Update.get_current(), e)
            )
        else:
            if isinstance(response, BaseResponse):
                self._loop_create_task(response.execute_response(self.bot))

    @functools.wraps(func)
    async def wrapper(*args, **kwargs):
        task = self._loop_create_task(func(*args, **kwargs))
        task.add_done_callback(process_response)

    return wrapper