使用C# TDengine驱动消费数据失败

发布于 2025-01-15 21:26:29 字数 1846 浏览 2 评论 0原文

我使用C# TDengine驱动程序从taos数据库订阅数据。我的示例代码如下所示:

public void RunSubscribeWithoutCallback(IntPtr conn, string table)
        {

            PrepareData(conn, table);
            string topic = $"{table}_topic";
            string sql = $"select * from {table}";
            IntPtr subscribe = TDengine.Subscribe(conn, true, topic, sql, null, IntPtr.Zero, 1000);
            Console.WriteLine("consume from begin");
            IntPtr taosRes = TDengine.Consume(subscribe);

            UtilsTools.DisplayRes(taosRes);
            TDengine.FreeResult(taosRes);
            for (int i = 0; i < 3; i++)
            {
                InsertData(conn, table);
            }
            Console.WriteLine("consume new data");
            taosRes = TDengine.Consume(subscribe);
            UtilsTools.DisplayRes(taosRes);
            Console.WriteLine("Unsubscribe and keep progress");
            TDengine.FreeResult(taosRes);

            TDengine.Unsubscribe(subscribe, false);
        }

虽然输出如下

root@mybook:~/git_space/test/TDengine/src/connector/C#/examples# dotnet run 如果存在则删除数据库 csharp_example_db 成功 如果不存在则创建数据库 csharp_example_db 保持 3650 成功 使用csharp_example_db成功 如果不存在则创建表 subscribe_without_callback (ts timestamp,i8tinyint,i16smallint,i32int,i64bigint);成功 插入 subscribe_without_callback 值(1646150410000,1,2,3,4)成功 从头开始消费 1646150410000 | 1 | 2 | 3 | 4 | 插入 subscribe_without_callback 值(1646150410100,1,2,3,4)成功 插入 subscribe_without_callback 值(1646150410200,-1,-2,-3,-4) 成功 插入 subscribe_without_callback 值(1646150410300,1,2,3,4)成功 插入 subscribe_without_callback 值(1646150410400,-1,-2,-3,-4) 成功 插入 subscribe_without_callback 值(1646150410500,1,2,3,4)成功 插入 subscribe_without_callback 值(1646150410600,-1,-2,-3,-4) 成功 消耗新数据

我只能第一次消耗。下一次应用程序崩溃了。并且 taoslog 文件中没有任何错误。 有谁知道如何解决这个问题?

I used C# TDengine driver to subscribe data from taos database. My a sample code is like bellow:

public void RunSubscribeWithoutCallback(IntPtr conn, string table)
        {

            PrepareData(conn, table);
            string topic = 
quot;{table}_topic";
            string sql = 
quot;select * from {table}";
            IntPtr subscribe = TDengine.Subscribe(conn, true, topic, sql, null, IntPtr.Zero, 1000);
            Console.WriteLine("consume from begin");
            IntPtr taosRes = TDengine.Consume(subscribe);

            UtilsTools.DisplayRes(taosRes);
            TDengine.FreeResult(taosRes);
            for (int i = 0; i < 3; i++)
            {
                InsertData(conn, table);
            }
            Console.WriteLine("consume new data");
            taosRes = TDengine.Consume(subscribe);
            UtilsTools.DisplayRes(taosRes);
            Console.WriteLine("Unsubscribe and keep progress");
            TDengine.FreeResult(taosRes);

            TDengine.Unsubscribe(subscribe, false);
        }

While the output is like these

root@mybook:~/git_space/test/TDengine/src/connector/C#/examples# dotnet run
drop database if exists csharp_example_db success
create database if not exists csharp_example_db keep 3650 success
use csharp_example_db success
create table if not exists subscribe_without_callback (ts timestamp,i8 tinyint,i16 smallint,i32 int,i64 bigint); success
insert into subscribe_without_callback values(1646150410000,1,2,3,4) success
consume from begin
1646150410000 | 1 | 2 | 3 | 4 |
insert into subscribe_without_callback values(1646150410100,1,2,3,4) success
insert into subscribe_without_callback values(1646150410200,-1,-2,-3,-4) success
insert into subscribe_without_callback values(1646150410300,1,2,3,4) success
insert into subscribe_without_callback values(1646150410400,-1,-2,-3,-4) success
insert into subscribe_without_callback values(1646150410500,1,2,3,4) success
insert into subscribe_without_callback values(1646150410600,-1,-2,-3,-4) success
consume new data

I can only get consume the first time. For the next time the application crashed. And there isn’t any error in taoslog file.
Does any one know how to fix this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

命硬 2025-01-22 21:26:29

我以前也遇到过这种情况。这是因为您释放了 taosRes,它是一个 TAOS_RES 结构体,有一些内存由对象 subscribe 共享,它是一个 TAOS_SUB 结构体。它们共享一个指针 SSqlObj * pSql; 如果您释放“taosRes”,这将导致下一个消费段错误,而 C# 应用程序很难意识到这一点。
而且TDengine的网站上也提到了这一点。
界面说明

I also faled in this situation before. This is because you free the taosRes which is a struct TAOS_RES, there an some memory share by for the object subscribe Which is a struct TAOS_SUB. they share a pointer SSqlObj * pSql; if you release you 'taosRes' that will lead for the next consume segment fault and this is hard for C# application to realize this.
What's more, this has been mentioned in TDengine's website.
interface description

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文