在 C# 6.0 中使用异步
Async within using in C# 6.0
我正在 'VisualStudio 2017'、'C# 6.0'、'R#' 上开发应用程序。在 C# 6.0
中引入了新功能 - 支持 async/await' within
try/cath'。我使用 using
运算符(实际上是 try/finaly
),但我仍然收到警告 Access to disposed closure
。但实际上 msGet 不应该在 DownloadToStreamAsync
之前被处理掉。
- 真的可以访问disposed变量吗?
- 是
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。这就是我问的原因。
你的 Do
方法接受一个 Func<Task>
,在你提供这个的调用中,你包含对 msGet
的引用,这是一个闭包,编译器会将它变成从您的 Func<Task>
.
访问的字段
Resharper 无法确定您对 Func<Task>
的使用是否在 using
块的范围或生命周期内,例如,您可以在 Do
方法中复制func 到一个字段中,稍后再调用它。
如果您在 Do
内立即执行 Func<Task>
您可以安全地忽略警告:
// ReSharper disable once AccessToDisposedClosure
我正在 'VisualStudio 2017'、'C# 6.0'、'R#' 上开发应用程序。在 C# 6.0
中引入了新功能 - 支持 async/await' within
try/cath'。我使用 using
运算符(实际上是 try/finaly
),但我仍然收到警告 Access to disposed closure
。但实际上 msGet 不应该在 DownloadToStreamAsync
之前被处理掉。
- 真的可以访问disposed变量吗?
- 是
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。这就是我问的原因。
你的 Do
方法接受一个 Func<Task>
,在你提供这个的调用中,你包含对 msGet
的引用,这是一个闭包,编译器会将它变成从您的 Func<Task>
.
Resharper 无法确定您对 Func<Task>
的使用是否在 using
块的范围或生命周期内,例如,您可以在 Do
方法中复制func 到一个字段中,稍后再调用它。
如果您在 Do
内立即执行 Func<Task>
您可以安全地忽略警告:
// ReSharper disable once AccessToDisposedClosure