在 C# 6.0 中使用异步

Async within using in C# 6.0

我正在 'VisualStudio 2017'、'C# 6.0'、'R#' 上开发应用程序。在 C# 6.0 中引入了新功能 - 支持 async/await' withintry/cath'。我使用 using 运算符(实际上是 try/finaly ),但我仍然收到警告 Access to disposed closure。但实际上 msGet 不应该在 DownloadToStreamAsync 之前被处理掉。

我的代码:

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。这就是我问的原因。

你的 Do 方法接受一个 Func<Task>,在你提供这个的调用中,你包含对 msGet 的引用,这是一个闭包,编译器会将它变成从您的 Func<Task>.

访问的字段

Resharper 无法确定您对 Func<Task> 的使用是否在 using 块的范围或生命周期内,例如,您可以在 Do 方法中复制func 到一个字段中,稍后再调用它。

如果您在 Do 内立即执行 Func<Task> 您可以安全地忽略警告:

// ReSharper disable once AccessToDisposedClosure