问题标签 [iasyncdisposable]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
717 浏览

c# - 在 IAsyncEnumerable 方法中正确处理?

对此的答案可能是不可能的,但问题是:假设您有一个 C# 方法来使用TextReader返回的 a 中的行IAsyncEnumerable<string>。你如何确保什么时候被DisposeAsync调用?或者这是您需要编写自定义实现来实现的?IAsyncEnumerator<string>TextReader

0 投票
4 回答
1008 浏览

c# - 在 DisposeAsync 中处理异常的正确方法

在切换到新的 .NET Core 3 的过程IAsynsDisposable中,我偶然发现了以下问题。

问题的核心:如果DisposeAsync抛出异常,这个异常隐藏了await using-block内部抛出的任何异常。

被捕获的是DisposeAsync-exception 如果它被抛出,并且await using只有内部的异常DisposeAsync没有抛出。

但是,我更喜欢另一种方式:await using如果可能,从块中获取异常,并且 -DisposeAsync仅当await using块成功完成时才出现异常。

理由:假设我的班级D使用一些网络资源并订阅了一些远程通知。里面的代码await using可能会出错并导致通信通道失败,然后在 Dispose 中尝试优雅地关闭通信(例如,取消订阅通知)的代码也会失败。但是第一个例外为我提供了有关问题的真实信息,而第二个例外只是次要问题。

在另一种情况下,当 main 部分运行并且处理失败时,真正的问题在 inside DisposeAsync,因此异常 fromDisposeAsync是相关的。这意味着仅仅抑制内部的所有异常DisposeAsync不应该是一个好主意。


我知道非异步 case 也存在同样的问题:异常 infinally覆盖了异常 in try,这就是为什么不建议 throw in 的原因Dispose()。但是在关闭方法中抑制异常的网络访问类看起来一点也不好看。


可以使用以下帮助程序解决该问题:

并像使用它一样

这有点丑陋(并且不允许在 using 块内提前返回之类的事情)。

如果可能的话,是否有一个好的、规范的解决方案await using?我在互联网上的搜索甚至没有发现讨论这个问题。

0 投票
1 回答
188 浏览

c# - 如何安全地处理使用 await foreach 检索到的 IAsyncDisposable 对象?

我可以这样做吗using var

或者我应该这样做:

还是因为迭代器是 anIAsyncDisposable并且await foreach会为我做它,所以我可以不进行处理吗?

0 投票
0 回答
37 浏览

c# - 如何使用同时实现 IDisposable 和 IAsyncDisposable 的类型?

我目前正在使用 ASP.NET core 3.1 和 C# 8。

这是我第一次接触整个IAsyncDisposable故事,所以完全有可能我的理解只是片面的,这个问题是愚蠢的。

根据我的理解,IAsyncDisposable当需要以异步方式释放它拥有的资源时,类型应该实现接口,以便可以在不阻塞线程的情况下进行所需的处理。换句话说,IAsyncDisposable它的异步对应物IDisposable允许以有效的方式释放类资源(就线程使用而言)。

该语言支持使用IAsyncDisposable通过 newawait using构造实现的类型,这基本上是using关键字的异步对应物。

到目前为止,一切都很好。

我注意到有一些 BCL 类型同时实现了IAsyncDisposableIDisposable,其中之一是Stream抽象类。IFormFile.OpenReadStream我在处理 ASP.NET 核心中上传的文件并调用该方法时遇到了这种情况。

我现在的问题是:我应该如何使用实现IAsyncDisposable和的类型IDisposable?我应该使用经典using关键字还是应该选择await using

我写的这段代码是同步的,所以处理流的最自然的方法如下:

我应该制作我的方法async以便能够以await using下列方式使用吗?

(考虑到,除了await using调用,我的方法不需要是异步的)

Dispose调用与DisposeAsync实现它们的类型有什么区别?

0 投票
0 回答
162 浏览

c# - 没有可用的同步处理时如何处理 IAsyncDisposable 和 IDisposable 接口?

我正在Connection围绕互操作对象编写一个类似的类。特别是,我的连接的关闭是异步的。

我正在与之交互的对象的 API 很差,例如:

所有方法都立即返回。

这是我最终得到的界面:

以及以下实现:

我面临的问题是我对采取的方法有点困惑,关于实现与否IDisposableIDisposableAsync根据MSDN

在实现 IAsyncDisposable 接口时,通常类也将实现 IDisposable 接口。

但在 MSDN示例中,它们Utf8JsonWriter同时实现了 aIDisposableIDisposableAsync方法,这使得这些接口的实现在他们的示例中变得容易。

就我而言,我没有同步清理操作。我不想实现这样的操作,因为我不希望Close操作在当前操作实际完成之前返回。

那么,只实施可以IDisposableAsync吗?

或者我应该实现一个同步Close方法(只调用_myObject.AbortLongTask();,或者可能使用丑陋Thread.Sleep()的而不是Task.Delay())并同时实现IDisposableand IDisposableAsync

0 投票
1 回答
88 浏览

c# - 继承自 Stephen Cleary 的 Nito.Disposables NuGet 包

我看到了 Stephen Cleary 的 Disposables NuGet 包的实现,在我的情况下它似乎很完美,即使如此,我也找不到如何从它继承的示例。

我的想法是 make UnsubscribeAsync().GetAwaiter().GetResult();to await UnsubscribeAsync();,这意味着它应该被包装到一个 IAsyncDisposable 中。我怎么能用一个密封的类来实现呢?

0 投票
1 回答
56 浏览

javascript - 我应该使用 JS 模块在 Program.cs 中调用 IAsyncDisposable.DisposeAsync() 吗?

我需要在 Blazor WASM、.NET 6 中配置本地化

根据手册,我需要在Program.cs文件中使用 JavaScript。Microsoft 建议通过JavaScript 模块中的 JavaScript 隔离来连接 JavaScript 代码。但是,示例中指定的代码是 Blazor 组件,并IAsyncDisposable.DisposeAsync()在那里调用

我是否需要调用IAsyncDisposable.DisposeAsync()Program.cs如果需要,如何在不诉诸创建Program类和Main方法的情况下调用,而是使用新版本的控制台程序模板?

0 投票
1 回答
97 浏览

c# - 如何正确使用“等待使用”语法?

我有以下同步代码,效果很好:

我想把它改成异步的。所以:

哪个编译。但是我使用的一种分析器(Meziantou.Analyzer)现在建议我“更喜欢使用'await using'”。我从来没有使用过 await using (尽管我过去尝试过几次并且总是遇到我现在遇到的同样的问题)。但我想使用它,所以:

现在它不再编译:CS0029 Cannot implicitly convert type 'System.Runtime.CompilerServices.ConfiguredAsyncDisposable' to 'System.IO.StreamWriter'. 好的,好的,所以我将其改为使用var

它通过了 CS0029,但现在后面的代码无法编译:(Error CS1061 'ConfiguredAsyncDisposable' does not contain a definition for 'WriteLineAsync'和类似的FlushAsync.Soooo ......也许可以转换它?

没有:Error CS0030 Cannot convert type 'System.Runtime.CompilerServices.ConfiguredAsyncDisposable' to 'System.IO.StreamWriter'

我已经用谷歌搜索了一堆并阅读了一堆,现在和过去几次,但我完全无法弄清楚如何使用这个“等待使用”的东西。我该怎么做?谢谢。