问题标签 [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.
c# - 在 IAsyncEnumerable 方法中正确处理?
对此的答案可能是不可能的,但问题是:假设您有一个 C# 方法来使用TextReader
返回的 a 中的行IAsyncEnumerable<string>
。你如何确保什么时候被DisposeAsync
调用?或者这是您需要编写自定义实现来实现的?IAsyncEnumerator<string>
TextReader
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
?我在互联网上的搜索甚至没有发现讨论这个问题。
c# - 如何安全地处理使用 await foreach 检索到的 IAsyncDisposable 对象?
我可以这样做吗using var
:
或者我应该这样做:
还是因为迭代器是 anIAsyncDisposable
并且await foreach
会为我做它,所以我可以不进行处理吗?
c# - 如何使用同时实现 IDisposable 和 IAsyncDisposable 的类型?
我目前正在使用 ASP.NET core 3.1 和 C# 8。
这是我第一次接触整个IAsyncDisposable
故事,所以完全有可能我的理解只是片面的,这个问题是愚蠢的。
根据我的理解,IAsyncDisposable
当需要以异步方式释放它拥有的资源时,类型应该实现接口,以便可以在不阻塞线程的情况下进行所需的处理。换句话说,IAsyncDisposable
它的异步对应物IDisposable
允许以有效的方式释放类资源(就线程使用而言)。
该语言支持使用IAsyncDisposable
通过 newawait using
构造实现的类型,这基本上是using
关键字的异步对应物。
到目前为止,一切都很好。
我注意到有一些 BCL 类型同时实现了IAsyncDisposable
和IDisposable
,其中之一是Stream
抽象类。IFormFile.OpenReadStream
我在处理 ASP.NET 核心中上传的文件并调用该方法时遇到了这种情况。
我现在的问题是:我应该如何使用实现IAsyncDisposable
和的类型IDisposable
?我应该使用经典using
关键字还是应该选择await using
?
我写的这段代码是同步的,所以处理流的最自然的方法如下:
我应该制作我的方法async
以便能够以await using
下列方式使用吗?
(考虑到,除了await using
调用,我的方法不需要是异步的)
Dispose
调用与DisposeAsync
实现它们的类型有什么区别?
c# - 没有可用的同步处理时如何处理 IAsyncDisposable 和 IDisposable 接口?
我正在Connection
围绕互操作对象编写一个类似的类。特别是,我的连接的关闭是异步的。
我正在与之交互的对象的 API 很差,例如:
所有方法都立即返回。
这是我最终得到的界面:
以及以下实现:
我面临的问题是我对采取的方法有点困惑,关于实现与否IDisposable
。IDisposableAsync
根据MSDN:
在实现 IAsyncDisposable 接口时,通常类也将实现 IDisposable 接口。
但在 MSDN示例中,它们Utf8JsonWriter
同时实现了 aIDisposable
和IDisposableAsync
方法,这使得这些接口的实现在他们的示例中变得容易。
就我而言,我没有同步清理操作。我不想实现这样的操作,因为我不希望Close
操作在当前操作实际完成之前返回。
那么,只实施可以IDisposableAsync
吗?
或者我应该实现一个同步Close
方法(只调用_myObject.AbortLongTask();
,或者可能使用丑陋Thread.Sleep()
的而不是Task.Delay()
)并同时实现IDisposable
and IDisposableAsync
?
c# - 继承自 Stephen Cleary 的 Nito.Disposables NuGet 包
我看到了 Stephen Cleary 的 Disposables NuGet 包的实现,在我的情况下它似乎很完美,即使如此,我也找不到如何从它继承的示例。
我的想法是 make UnsubscribeAsync().GetAwaiter().GetResult();
to await UnsubscribeAsync();
,这意味着它应该被包装到一个 IAsyncDisposable 中。我怎么能用一个密封的类来实现呢?
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
方法的情况下调用,而是使用新版本的控制台程序模板?
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'
我已经用谷歌搜索了一堆并阅读了一堆,现在和过去几次,但我完全无法弄清楚如何使用这个“等待使用”的东西。我该怎么做?谢谢。