Будет ли использование await на Task.Run вызывать ошибку «Доступ к закрытому закрытию»? - PullRequest
0 голосов
/ 28 августа 2018

Пример кода

public async Task HeavyTask()
{
  using(var res = new BigResource())
  {
    await Task.Run(() => service.Do(res));
  }
}

У меня есть код, похожий на приведенный выше, и ReSharper предупреждает меня о «Доступе к закрытому закрытию» при использовании экземпляра res.

Если бы я не использовал ключевое слово await, я знаю, что res экземпляр может быть удален , когда service пытается получить к нему доступ.

Но я думаю, что если я использую ключевое слово await, поток, который выполняет метод HeavyTask, не будет продолжаться до тех пор, пока не будет завершен Task.Run, и не должно быть никакого риска доступа к удаленному закрытию.

Пожалуйста, помогите мне понять, где я ошибся, и какой способ решения этой проблемы предпочтителен.

1 Ответ

0 голосов
/ 28 августа 2018

Вы не ошибетесь. Это не будет доступа к res после его утилизации. Проблема в том, что ReSharper этого не знает. Task.Run может сохранить делегат, чтобы выполнить его позже. Единственный способ узнать, что это не так, это то, что вы знаете, что делает Task.Run. ReSharper нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...