当前位置:  开发笔记 > 编程语言 > 正文

检测异步BeginExecuteReader中的命令取消

如何解决《检测异步BeginExecuteReader中的命令取消》经验,为你挑选了1个好方法。

我正在异步调用sql命令的beingexecutereader方法,用户可以取消.当取消发生时,我取消sqlcommand对象,这将杀死sql server上正在执行的作业.

但是,一旦我取消它,就会调用BeginExecute查询中指定的回调方法,并在尝试调用endexecutequery时出错.结果.Iscompleted是真的,直到调用了endexecute查询,此时它变为false.

有没有办法在回调方法中检测到该命令被取消了?或者我必须跟踪那个......

谢谢



1> STW..:

我已经删除并重新开始了我的整个答案:你偶然发现了一个相互矛盾的文档和警告的好例子......

根据SqlCommand.Cancel的.NET 2.0 MSDN文档 "取消方法不能用于取消挂起的异步操作." 但是,.NET 3.5的相同文档不包含此警告 - 尽管与2.0文档完全相同.

我建议遵循以异步方式调用同步方法中概述的约定,该约定针对Delegate.BeginInvoke(不是Control.BeginInvoke!)和Delegate.EndInvoke,但可能与您的情况相关.

名为"Begin ... Async"的方法返回IAsyncResult并具有相应的"End ..."方法,可能会产生ThreadPool泄漏.防止泄漏的最简单方法是确保始终调用相应的"End ..."方法.

原因是当调用Begin ... Async时,它从ThreadPool获取一个线程,并且(通常)在工作线程上执行该方法的同步版本; 在您的情况下ExecuteReader().该调用的返回值,或在该调用期间发生的任何异常,在调用End ...之前不会返回到主线程 - 如果您从不调用End,则永远不会返回结果/异常并且ThreadPool线程永远不会被释放.

长话短说,只要你确保调用EndExecuteReader()并处理预期的异常,你就很安全了.由于文档是矛盾和模糊的,我已经开始讨论MSDN反馈论坛.

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有