取消长时间运行的Dapper查询。

3
我们有一个WinForms应用程序,使用Dapper进行数据库读取。
在一个窗体中,我们可能会有一个长时间运行的查询在后台线程上运行。
用户希望能够取消该查询,因此我需要访问Dapper创建的DbCommand并从另一个线程上调用Cancel方法来取消正在运行的查询。
如何最好地从Dapper中公开这个DbCommand呢?

我以为我终于摆脱了手动数据读取器的麻烦...看来并没有。但是,我仍然喜欢Dapper。 - Rik
如果你对此有任何特别的想法,我全听着……但是……我看不到任何简单的方法。 - Marc Gravell
我认为可以引入一个IQueryPipeline接口的可选参数,该参数公开了我需要的事件。 - Rik
@MarcGravell,我们可以通过显式转换来访问它吗?例如 ((WrappedReader)reader).Cancel() 或类似的方式。 - Chris Marisic
我们也需要这个... - frankhommers
显示剩余2条评论
1个回答

0

这是锤子时间。打破一些东西。

using (var reader = connection.ExecuteReader(query)) {

...现在取消

var wrappedReaderType = typeof (Dapper.CommandDefinition)
                        .Assembly.GetType("Dapper.WrappedReader");
var field = wrappedReaderType
            .GetField("cmd", BindingFlags.NonPublic | BindingFlags.Instance);
if (field != null)
{
    var command = field.GetValue(reader) as IDbCommand;
    if (command != null)
    {
        command.Cancel();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接