gpt4 book ai didi

c# - 在异步 BeginExecuteReader 中检测命令取消

转载 作者:太空狗 更新时间:2023-10-29 20:12:19 24 4
gpt4 key购买 nike

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

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

有什么方法可以在回调方法中检测到命令被取消了吗?还是我必须跟踪那个...

谢谢

最佳答案

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

根据.NET 2.0 MSDN Documentation for the SqlCommand.Cancel “Cancel 方法不能用于取消挂起的异步操作。”但是,.NET 3.5 的文档完全相同不包含此警告——尽管在其他方面与 2.0 文档相同。

我建议遵循 Calling Synchronous Methods Asynchronously 中概述的约定它针对 Delegate.BeginInvoke(不是 Control.BeginInvoke!)和 Delegate.EndInvoke,但可能与您的情况相关。

返回 IAsyncResult 并具有相应“End...”方法的名为“Begin...Async”的方法有可能造成线程池泄漏。防止泄漏的最简单方法是确保始终调用相应的“End...”方法。

原因是当调用 Begin...Async 时,它从 ThreadPool 中获取一个线程并(通常)在工作线程上执行该方法的同步版本;在你的例子中是 ExecuteReader()。该调用的返回值或该调用期间发生的任何异常都不会返回到主线程,直到调用 End...永远不会被释放。

长话短说,只要您确保调用 EndExecuteReader() 并处理预期的异常,您就可能是安全的。由于文档自相矛盾且含糊不清,因此我开始了 discussion on the MSDN Feedback Forums .

关于c# - 在异步 BeginExecuteReader 中检测命令取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/642951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com