问题标签 [iasyncresult]

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 投票
2 回答
9907 浏览

c# - 显式实现 IAsyncResult

我通常对部分实现接口持谨慎态度。然而,IAsyncResult这是一种特殊情况,因为它支持几种完全不同的使用模式。您多久使用/看到使用AsyncState/AsyncCallback模式,而不是仅仅调用EndInvoke、使用AsyncWaitHandle或轮询IsCompleted(讨厌)?

相关问题:Detecting that a ThreadPool WorkItem has completed/waiting for completion

考虑这个类(非常近似,需要锁定):

它有WaitHandle(懒惰地创建,正如IAsyncResult文档中描述的那样)和IsCompleted,但我没有看到AsyncState{return null;}?)的合理实现。那么实施它有意义IAsyncResult吗?请注意,Task在 Parallel Extensions 库中确实实现了IAsyncResult,但只是IsCompleted隐式实现。

0 投票
2 回答
7244 浏览

c# - 以多线程方式使用 BeginInvoke/EndInvoke。AsyncCallback、AsyncWaitHandle 和 IsCompleted 如何交互?

Andreas Huber 对这个问题的回答让我想到了Concurrent<T>使用异步委托而不是线程池来实现。但是,我发现更难理解将 anAsyncCallback传递给时发生了什么BeginInvoke,尤其是当多个线程可以访问IAsyncResult. 不幸的是,MSDN 或我能找到的任何地方似乎都没有涵盖这种情况。此外,我能找到的所有文章要么是在闭包和泛型可用之前编写的,要么看起来就是这样。有几个问题(我希望答案是真的,但我准备好失望了):

1) 使用闭包作为 AsyncCallback 会有什么不同吗?
(希望不是)
2)如果一个线程在等待AsyncWaitHandle,它会
在回调开始之前或 b)在它完成之后发出信号吗?
(希望是b)
3)当回调运行时,会IsCompleted返回什么?我可以看到的可能性:
a)true;b) false; c)false在回调调用 EndInvoke 之前,true之后。
(希望是 b 或 c)
4)DisposedObjectException如果某个线程在调用AsyncWaitHandle之后等待会被抛出EndInvoke
(希望不是,但我希望是的)。

如果答案如我所愿,这似乎应该有效:

如果问题 1-3 的答案是我所希望的,那么据我所知,这里应该没有种族条件。

0 投票
1 回答
6421 浏览

c# - C#、IAsyncResult 和线程池

我用的Action<object>.BeginInvoke()方法,这个是用线程池还是不用线程池?

我有以下 C# 代码:

线程池是否在幕后使用?还是系统创建正常线程?

0 投票
4 回答
3193 浏览

c# - 如何轻松地将两个异步请求链接在一起?

2013 年编辑: async现在await让这变得微不足道!:-)


我有一些屏幕抓取网站的代码(仅用于说明目的!)

现在,我想异步调用 GetDilbert()。使用委托的简单方法:

虽然这确实有效,但它的效率并不高,因为委托线程将花费大部分时间等待两个 I/O 操作。

我想做的是打电话request.BeginGetResponse(),做正则表达式匹配,然后打电话imageRequest.BeginGetResponse()。同时使用标准异步调用模式并保留BeginGetDilbert()EndGetDilbert()的签名。

我尝试了几种方法,但对其中任何一种都不完全满意;这似乎是一种皇家的痛苦。因此,问题。:-)


编辑: C# 编译器团队似乎不赞成使用迭代器的方法。

编译器团队的请求:

虽然可以肯定的是,您可以使用迭代器来实现状态机、穷人协程等等,但我希望人们不要这样做。

请按照预期目的使用工具。如果您想编写状态机,请为自己编写一个专门用于解决该一般问题的库,然后使用它。

将工具用于预期目的之外的目的是“聪明的”,聪明是坏的;聪明让维护程序员难以理解,聪明难以扩展,聪明难以推理,聪明让人“开箱即用”;那个盒子里有好东西。


选择Future<>答案,因为它保留在 C# 中,这与我的示例代码相同。不幸的是,TPL 和 F# 都没有得到 Microsoft 的官方支持……但是。

0 投票
2 回答
10034 浏览

.net - IAsyncResult 接口的正确实现是什么?

我正在考虑为我创建的类增加一些灵活性,该类建立与远程主机的连接,然后执行信息交换(握手)。当前实现提供了一个 Connect 函数,该函数建立连接,然后阻塞等待 ManualResetEvent 直到双方完成握手。

这是调用我的类的示例:

..这是该类内部功能的过度简化的高级视图:

我正在研究为这个类实现.NET Classic Async Pattern。为此,我将提供 BeginConnect 和 EndConnect 函数,并允许该类的用户编写如下代码:

为了能够提供此 API,我需要创建一个实现 IAsyncResult 接口的类,该接口由 BeginConnect 函数返回,并分别传递给 EndConnect 函数。

现在,我的问题是:在类中实现 IAsyncResult 接口的正确方法是什么?

一个明显的解决方案是为 Connect 函数创建一个具有匹配签名的委托,然后使用 BeginInvoke - EndInvoke 异步调用该委托,但这不是我想要的(它不是很有效)。

我对如何做到这一点有一个粗略的想法,但是在查看了 .NET 框架内部他们如何在某些地方实现这种模式之后,我觉得问问是否有人成功地做到了这一点是明智的,如果是的话是什么问题领域要特别注意。

谢谢!

0 投票
2 回答
1864 浏览

c# - 泛化委托/IAsyncResult 调用

我有一个 WCF Web 服务,它当前搜索多个硬编码的 dtSearch 索引,然后合并生成的数据集以返回给客户端。我有以下 C# 代码:

我的问题是:将此逻辑移动到一个单独的通用类并为 1...n 个对象的列表执行此操作的最佳方法是什么?

我创建了一个通用对象,它现在执行所有物理搜索(替换 SearchPIndex 和 SearchCIndex 方法),但我不确定如何将委托/IAsyncResult 调用集成到通用对象中。

有没有我可以遵循的最佳实践?


编辑:对不起......第一次作为网站上的“用户”......“答案”似乎比上面的“评论”更好。

我要玩它,但这会在方法中起作用吗?

0 投票
1 回答
537 浏览

c# - AsyncWaitHandle 终止第 3 方 API 是否正确实施?

“session.identify”是我调用但无权访问的第三方 COM API。它执行一个服务器查询,不知何故,偶尔会锁定(并因此停止等待结果的主程序)。

我的尝试是将它包装在 AsyncDelegate 中,这样我就可以给它一个超时,并且在超时到期后允许主程序继续进行(类似于这个,只有一个返回值)。但是,它仍然会锁定而超时没有效果。

我是否错误地使用了 AsyncHandle.WaitOne?API 中有什么东西可以阻止它被中止吗?

0 投票
3 回答
8384 浏览

c# - 同步和异步回调

在阅读 MSDN 文档和代码示例时,我对某些术语感到困惑。

C# 中的回调是什么?特别是,什么是同步和异步回调?

请从外行的角度解释这些。

另外,请解释一下IAsyncCallback IAsyncResult接口。我们如何实现它?(有一个非常简单的例子)

提前致谢。

0 投票
1 回答
883 浏览

.net - 异步 HttpWebRequest - 线程号

假设我有以下代码:

我希望在向控制台写入 ManagedThreadId 时会看到很多线程 - 当然我错了:)。我通常只看到 2 个不同的线程 ID,偶尔会看到 3 个线程 ID。

为什么会有这种行为?我错过了什么?

0 投票
2 回答
1558 浏览

c# - 阻塞直到事件完成

在异步事件完成之前如何阻塞?

这是通过在事件处理程序中设置标志并轮询标志来阻止直到调用事件的方法:

有没有办法在没有轮询的情况下做到这一点?