使用c将数据记录到cassandra中#

stszievb  于 2021-06-13  发布在  Cassandra
关注(0)|答案(1)|浏览(342)

我试图用c#将数据记录到cassandra中。所以我的目标是在200ms内记录尽可能多的数据点。我试图在200ms内节省时间、随机键和值。请参阅代码以供参考。while循环之后如何执行会话的问题。

Cluster cluster = Cluster.Builder()
                   .AddContactPoint("127.0.0.1")
                   .Build();
ISession session = cluster.Connect("log");  //keyspace to connect with

var ps = session.Prepare("Insert into logcassandra(nanodate, key, value) values (?,?,?)");

stopwatch.Start();
while(stop.ElapsedMilliseconds <= 200)
{
    i++;
    var statement = ps.Bind(nanoTime(),"key"+i,"value"+i);
    session.ExecuteAsync(statement);
}
8yoxcaq7

8yoxcaq71#

请选择带 TimerCallback 结束 Stopwatch .
编辑:(回复评论)
嗨,我不确定您想要实现什么,但是这里有一些关于异步调用和并行执行的一般概念。在.net世界中,异步主要用于非阻塞i/o操作,这意味着您的调用线程不会等待i/o驱动程序的响应。换句话说,您示例化一个i/o操作,并将这个工作分派给一个在.net生态系统之外的“东西”,它将还给您一个未来(a) Task ). 驱动程序承认它收到了请求,并承诺一旦有空闲容量,它就会处理它。
那个 Task 表示成功或失败的异步工作。但是,因为您是异步调用它的,所以您没有等待它的结果(没有阻止调用线程等待外部工作),而是转到下一条语句。最终这个操作将完成,届时司机将通知 Task 请求操作已完成(任务可视为主叫方和被叫方之间的主要通信通道)
在您的例子中,您使用的是fire-and-forget样式的异步调用。这意味着您正在异步启动许多i/o操作,而忘记了处理它们的结果。你不知道他们有没有失败。但是你打电话给Cassandra做了很多工作。你的时间度量只用于解雇工作,这意味着你不知道这些工作已经完成了多少。
如果你选择使用 await 对于异步调用,这意味着while循环将被串行执行。您可能会启动一个作业,而您无法继续进行下一个迭代,因为您正在等待它,因此您的调用线程将在其调用堆栈中向上移动一级,并检查它是否可以处理某些内容。如果有 await 同时,它会向上移动一级,以此类推。。。

while(stop.ElapsedMilliseconds <= 200)
{
    await session.ExecuteAsync(statement);
}

如果您不希望串行执行而不是并行执行,那么可以根据需要创建任意多的作业,并作为一个整体等待它们。那就是 Task.WhenAll 在剧中出现。你将解雇很多工作,你将等待一个单一的工作,将跟踪所有其他工作。

var cassandraCalls = new List<Task>();
cassandraCalls.AddRange(Enumerable.Range(0, 100).Select(_ => session.ExecuteAsync(statement)));
await Task.WhenAll(cassandraCalls);

但此代码将一直运行到所有作业完成为止。如果您想限制整个执行时间,那么应该使用一些取消机制。 Task.WhenAll 不支持 CancellationToken . 但是你可以用几种方法来克服这个限制。最简单的解决方案是 Task.Delay 以及 Task.WhenAny . Task.Delay 将用于超时,并且 Task.WhenAny 将用于等待您的cassandra调用或超时完成。

var cassandraCalls = new List<Task>();
cassandraCalls.AddRange(Enumerable.Range(0, 100).Select(_ => ExecuteAsync()));
await Task.WhenAny(Task.WhenAll(cassandraCalls), Task.Delay(1000));

通过这种方式,您可以启动任意数量的作业,根据驱动程序的不同,它们可以并行或并发执行。你要么等待全部完成,要么等待一段时间。当 WhenAny 作业完成后,您可以检查作业的结果,但只需遍历cassandracalls

foreach (var call in cassandraCalls)
{
    Console.WriteLine(call.IsCompleted);
}

我希望这个解释能对你有所帮助。

相关问题