【发布时间】:2017-04-16 03:47:20
【问题描述】:
我正在“VisualStudio 2017”、“C# 6.0”、“R#”上开发应用程序。在C# 6.0 中引入了新功能 - 支持async/await' withintry/cath'。我使用 using 运算符(实际上是 try/finaly 在引擎盖下),但我仍然收到警告 Access to disposed closure。但真的 msGet 不应该在DownloadToStreamAsync 之前被释放。
- 它真的可以访问已处置的变量吗?
- 是
R#故障吗?
我的代码:
using( var msGet = new MemoryStream() )
{
var stopwatchAp = Stopwatch.StartNew();
var stopwatchPureDownload = new Stopwatch();
var times = new long[ 201 ];
var retryCount = -1;
await this._ap.Do( () =>
{
stopwatchPureDownload.Restart();
var downloadToStreamAsync = blob.DownloadToStreamAsync( msGet );
downloadToStreamAsync.ContinueWith( t => times[ ++retryCount ] = stopwatchPureDownload.ElapsedMilliseconds );
return downloadToStreamAsync;
} ).ConfigureAwait( false );
}
更新 1 我之前也看到过类似的问题:
Access to disposed closure in C#?
(但这里的例子不包含await,它不是关于'async/await')
Calling asynchronous method in using statement 。
(答案说 - 使用await。但你可以看到我的代码包含await - 但我仍然有警告)
这些问题也可以追溯到 2013 年。 2013 年没有 C# 6.0。这就是我问的原因。
【问题讨论】:
-
请发布代码而不是图片,这是一种不好的做法
-
@Alex 可以在 try 块内等待,但不能在 catch 或 finally 块内等待(在 C# 6 之前)。所以这与这个问题并不真正相关。
-
至于问题 - Resharper 不够聪明,无法识别捕获的
msSet在异步块运行时不会被释放。它只是看到您捕获并使用了一些后来被释放的变量(根本与异步无关)。 -
原始帖子的日期无关紧要。情况是一样的。该语言没有引入像这样的重大更改
-
此外 -
Do做什么?谁说它在返回之前执行 lambda before?无法保证msGet在代码实际执行时可用。Do可能会存储它以供以后执行。
标签: c# visual-studio async-await visual-studio-2017 c#-6.0