使用 await on Task.Run casue "access to disposed closure" 会出错吗?
Will using await on Task.Run casue "access to disposed closure" error?
代码示例
public async Task HeavyTask()
{
using(var res = new BigResource())
{
await Task.Run(() => service.Do(res));
}
}
我有一些代码与上面类似,ReSharper 在使用 res
实例时警告我 "Access to disposed closure"。
如果我没有使用 await
关键字,我知道 res
实例 可能 在 service
尝试访问时被释放它。
但是我觉得如果我使用await
关键字的话,执行HeavyTask
方法的线程不会继续执行,直到Task.Run
完成,应该没有风险访问已处置的闭包。
请帮助我了解哪里出了问题,以及解决此问题的首选模式是什么。
你不会错的。这将不会在处理后访问 res
。问题很简单,ReSharper 不知道这一点。 Task.Run
可以 存储委托以便稍后执行。您知道它不会那样做的唯一方法是因为您知道 Task.Run
的作用。 ReSharper 没有。
代码示例
public async Task HeavyTask()
{
using(var res = new BigResource())
{
await Task.Run(() => service.Do(res));
}
}
我有一些代码与上面类似,ReSharper 在使用 res
实例时警告我 "Access to disposed closure"。
如果我没有使用 await
关键字,我知道 res
实例 可能 在 service
尝试访问时被释放它。
但是我觉得如果我使用await
关键字的话,执行HeavyTask
方法的线程不会继续执行,直到Task.Run
完成,应该没有风险访问已处置的闭包。
请帮助我了解哪里出了问题,以及解决此问题的首选模式是什么。
你不会错的。这将不会在处理后访问 res
。问题很简单,ReSharper 不知道这一点。 Task.Run
可以 存储委托以便稍后执行。您知道它不会那样做的唯一方法是因为您知道 Task.Run
的作用。 ReSharper 没有。