客户端可以发送同步或异步事务。在同步事务中,客户端指定超时值,指示服务器等待处理事务的最长时间。DdeClientTransaction不会返回,直到服务器处理事务,事务失败或超时值过期。客户端在调用DdeClientTransaction时指定超时值。
在同步事务期间,客户端在等待处理事务时进入模态循环。客户端仍然可以处理用户输入,但是直到DdeClientTransaction返回为止,才能发送另一个同步事务。
客户机通过在DdeClientTransaction中指定TIMEOUT_ASYNC标志来发送异步事务。该函数在事务开始后返回,并将事务标识符传递给客户端。当服务器完成处理异步事务时,DDEML向客户端发送一个XTYP_XACT_COMPLETE事务。在XTYP_XACT_COMPLETE事务期间DDEML传递给客户端的一个参数是事务标识符。通过将此事务标识符与DdeClientTransaction返回的标识符进行比较,客户端会识别服务器已完成处理的异步事务。
客户端可以使用DdeSetUserHandle函数来帮助处理异步事务。此函数使客户端可以将应用程序定义的双字值与会话句柄和事务标识符相关联。客户端可以在XTYP_XACT_COMPLETE事务期间使用DdeQueryConvInfo函数来获取应用程序定义的双字值。由于此函数,应用程序不需要维护活动事务标识符的列表。
当客户端使用同步事务成功完成数据请求时,DDEML无法确定客户端何时完成使用接收到的数据。客户端应用程序必须将接收到的数据句柄传递给DdeFreeDataHandle函数,通知DDEML该句柄将不再被使用。同步事务返回的数据处理由客户端有效拥有。
如果服务器不及时处理异步事务,客户端可以通过调用DdeAbandonTransaction功能来放弃事务。当服务器完成处理时,DDEML将释放与事务关联的所有资源,并丢弃事务的结果。同步事务中的超时有效地取消了事务处理。
为同时执行大量处理(如执行计算)而必须发送大量DDE事务的应用程序提供异步事务处理方法。异步方法对于必须暂时停止处理DDE事务的应用程序也很有用,可以不间断地完成其他任务。在大多数其他情况下,应用程序应该使用同步方法。
同步事务维护更简单,比异步事务更快。但是,一次只能执行一次同步事务,而可以同时执行许多异步事务。使用同步事务,较慢的服务器可能导致客户端在等待响应时保持空闲状态。此外,同步事务导致客户端进入可以绕过应用程序自己的消息循环中的消息过滤的模态循环。
如果客户端已经安装了一个挂接过程来过滤消息(即在调用SetWindowsHookEx函数时指定了WH_MSGFILTER钩子类型),则同步事务不会导致系统绕过挂钩过程。当客户端等待同步事务结束时发生输入事件时,挂接过程接收到MSGF_DDEMGR挂钩代码。使用同步事务模态循环的主要危险在于,由对话框创建的模态循环可能会干扰其操作。当动态链接库(DLL)使用DDEML时,应始终使用异步事务。