问题标签 [asynchronous]

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 投票
5 回答
1978 浏览

c# - 垃圾收集器是否会在 .NET 中的异步调用期间销毁临时未引用的对象?

想象一下,我将在 .NET 中进行异步调用,即 HttpWebRequest.BeginGetResponse,并且 HttpWebRequest 对象没有在更广泛的范围内被引用。垃圾收集器会破坏它并引起问题吗?

示例代码:

替代版本(请求作为 AsyncState 传递):

0 投票
2 回答
1039 浏览

c++ - 使用 Boost.Asio 时确保有效对象寿命的最佳方法是什么?

最近玩了很多 Boost.Asio。我非常喜欢这个库,因为它提供了一种从当今多核系统中榨取性能的绝妙方法。

我曾经问过自己几次的一个问题,我认为在使用 Asio 进行异步调用时,关于对象生命周期/所有权的问题值得一提。

我反复遇到的问题是,您经常不得不“过期”一个仍然有异步回调待处理的对象。如果该对象在调用回调之前超出范围,则不可避免地会发生爆炸。

为了解决这个问题,我已将boost::enable_shared_from_this模板用作大多数基于 asio 的类的基类。这工作正常,但有点麻烦:通常这也意味着保护构造函数并向类添加工厂方法以确保在 shared_ptr 内创建所有实例。

我只是想知道其他人是如何解决这个问题的。我是最好的方法吗?还是我的 Asio.Foo 都错了?

讨论... :)

0 投票
2 回答
2104 浏览

asynchronous - 执行异步操作的自定义 Windows 工作流活动 - 使用通用服务重做

我正在编写一个自定义 Windows Workflow Foundation 活动,它异步启动一些进程,然后在异步事件到达时唤醒。

我发现的所有示例(例如Kirk Evans的示例)都涉及自定义工作流服务,该服务完成大部分工作,然后将事件发布到活动创建的队列。主要原因似乎是发布事件的唯一方法[在非 WF 线程中工作]是 WorkflowInstance.EnqueueItem,并且活动无权访问工作流实例,因此它们无法发布事件(来自我接收异步操作结果的非 WF 线程)。

我不喜欢这种设计,因为这会将功能分成两部分,并且需要在添加新活动类型时向主机添加服务。丑陋。

所以我编写了以下通用服务,我从活动的异步事件处理程序中调用它,并且可以被各种异步活动重用(省略错误处理):

现在在活动代码中,我可以获得并存储对此服务的引用,启动我的异步操作,当它完成时,使用此服务将事件发布到我的队列。这样做的好处 - 我将所有特定于活动的代码保留在活动中,并且我不必为每种活动类型添加新服务。

但是看到官方和互联网示例这样做会专门提供不可重用的服务,我想检查这种方法是否可以,或者我在这里制造了一些问题?

0 投票
6 回答
1349 浏览

c# - C#的多线程和并发性

在 Windows 窗体窗口中,多个事件可以触发异步方法。此方法下载文件并缓存它。我的问题是我希望该方法执行一次。换句话说,我想防止文件被多次下载。

如果下载文件的方法被触发两次,我希望第二次调用等待文件(或等待第一个方法完成)。

有人知道如何实现这一目标吗?

更新:我只是想防止不必要的下载。在我的例子中,当客户端将鼠标悬停在 ListBox 中的某个项目上超过几毫秒时,我们开始下载。我们假设用户会点击并请求文件。可能发生的情况是用户将鼠标悬停在项目上一秒钟,然后单击。在这种情况下,两个下载开始。我正在寻找处理这种情况的最佳方法。

更新2::用户有可能将鼠标移到多个项目上。结果,将发生多次下载。我对这种情况并不是很严格,但现在如果我们遇到这种情况,我们不会放弃下载。该文件将被下载(文件通常在 50-100kb 左右),然后将被缓存。

0 投票
1 回答
1128 浏览

wcf - 有没有办法获得异步 WCF 调用的错误反馈?

我有一个 WCF 服务,它在同步(阻塞)模式下 100% 工作,我现在需要重新处理一个调用,以便它使用异步模式。

该服务使用身份验证并执行从客户端到服务器的分块文件传输,因此我对其进行了重新设计以使用“开始”异步前缀来启动呼叫。

现在,我正在通过故意修改用户凭据来测试错误,这会导致在它尝试传输的文件块的每个部分上调用超时,这需要很长时间。问题是我没有收到任何错误反馈,并且如果异步调用失败,我也看不到如何获得任何错误反馈。这导致一些非常大的文件根本无法上传,但客户端没有意识到它没有抛出异常。

我勾选了 Debug->Exceptions->All CLR exceptions 以查看是否有任何异常被吞下,但仍然没有。

总而言之,您如何从 WCF 中的异步调用中获得错误反馈?

提前致谢,

瑞安

0 投票
11 回答
120946 浏览

c - C 非阻塞键盘输入

我正在尝试用 C 语言(在 Linux 上)编写一个程序,该程序循环直到用户按下一个键,但不应该需要按键来继续每个循环。

有没有一种简单的方法可以做到这一点?我想我可以做到这一点,select()但这似乎需要做很多工作。

或者,有没有办法在程序关闭而不是非阻塞 io 之前捕获ctrl-按键来进行清理?c

0 投票
4 回答
11838 浏览

c# - How to correctly use .NET2.0 serial port .BaseStream for async operation

I am attempting to use the .BaseStream property of the .NET2.0 SerialPort to do asynchronous reads and writes (BeginWrite/EndWrite, BeginRead/EndRead).

I am having some success in this, but after a time, I notice (using Process Explorer) a very gradual increase in the Handles the app is using, and occasionally an extra thread, which also increases the Handle count.

The context switch rate also increases each time a new thread appears.

The app constantly sends 3 bytes to a PLC device, and gets 800 or so bytes in return, and does so at a baud rate of 57600.

The initial CSwitch Delta (again, from Process Explorer) is around 2500, which seems very high anyway. Each time a new thread appears, this value increases, and the CPU load increases accordingly.

I'm hoping that somebody might have done something similar, and can help me out, or even say 'In God's name, don't do it that way.'

In the code below, 'this._stream' is obtained from SerialPort.BaseStream, and CommsResponse is a class I use as the IAsyncresult state object.

This code is common to a TCP connection I make as an alternative to using the serial port, (I have a CommsChannel base class, with a serial and TCP channel derived from it) and it has none of these problems so I'm reasonably hopeful that there is nothing wrong with the CommsResponse class.

Any comments gratefully received.

0 投票
3 回答
2009 浏览

apache-flex - 将 Web 服务结果与 Flex 中的请求匹配

在我回答这个问题之前,有一点(!)一点背景知识:

我有一个装有网格数组的手风琴控件,每个网格都是延迟加载的东西数组。我正在使用自动生成的 Web 服务代理来检索这些列表。我希望用户能够更改手风琴中选定的子项,而无需等待 Web 服务响应。我最初对所有请求使用相同的代理实例,并按照发出的顺序跟踪请求,但这样做的问题是较短的数组从服务器返回的速度更快,因此发出请求的顺序变得无关紧要.

在处理代理结果事件时,我找不到一个明显的方法来确定原始请求,所以我最终得到的是一个函数,它处理手风琴上的更改事件,实例化一个新的 web 服务代理,将其推入哈希表中选定子项的索引,然后添加一个闭包作为事件处理程序。即有点像这样:

(我试着匿名了一点,所以我可能错过了一些东西,但希望你明白)

那么,对于问题:有没有一种更简单的方法可以将代理结果与我刚刚丢失的原始请求相匹配?

如果不是,我所做的是否合理?我有点担心我最终可能生成然后正确处理它们的代理实例的数量(当有必要时) - 有没有我可能不知道的陷阱?

更新: 我认为可能会出现问题,因为生成的代理代码从 flash.events.Event 子类化 ResultEvents,而不是 mx.rpc.events.ResultEvent。我不完全确定它为什么这样做 - 访问 AsyncToken 的唯一方法是它最初由方法调用返回。

0 投票
9 回答
40430 浏览

c# - process.WaitForExit() 异步

我想等待一个进程完成,但process.WaitForExit()挂起我的 GUI。是否有基于事件的方式,或者我是否需要生成一个线程以阻塞直到退出,然后自己委托事件?

0 投票
3 回答
777 浏览

sql - 在 .NET 中,将数据从 SQL 流式传输到文件

我必须从 SQL 中获取 DataTable,然后将其转换为 XML(我不能使用 SQL XML)并保存到文件中。问题是该文件将是 5 GB,我没有足够的内存来下载它并在内存中一次将其转换为 XML。我知道我应该能够使用 DataReader 将数据分块转换并推送到文件流,但我不知道如何真正做到这一点。我该怎么做?

  1. 异步连接到 SQL 服务器
  2. 异步调用存储过程
  3. 从 DataReader 异步读取数据
  4. 将数据从 DataReader 转换为 XML 并异步保存到文件

这一切都必须是异步的,因为它在处理多个请求的服务器上,我们不能为每个请求设置一个线程阻塞。