C# 按顺序处理异步调用
我正在对Azure表存储进行大量或异步调用。由于明显的原因,这些记录的插入顺序与调用顺序不同 我计划引入ConcurrentQueue以确保顺序。以下作为POC编写的示例代码似乎达到了预期的效果 我想知道这是确保异步调用的最好方法吗 将按顺序完成吗C# 按顺序处理异步调用,c#,.net,azure,asynchronous,task-parallel-library,C#,.net,Azure,Asynchronous,Task Parallel Library,我正在对Azure表存储进行大量或异步调用。由于明显的原因,这些记录的插入顺序与调用顺序不同 我计划引入ConcurrentQueue以确保顺序。以下作为POC编写的示例代码似乎达到了预期的效果 我想知道这是确保异步调用的最好方法吗 将按顺序完成吗 如果您想要异步和顺序地处理记录,这听起来非常适合TPL Dataflow的ActionBlock。只需使用要执行的操作创建一个块,并向其发布记录。它支持异步操作并保持顺序: var block = new ActionBlock<Product
如果您想要异步和顺序地处理记录,这听起来非常适合TPL Dataflow的ActionBlock。只需使用要执行的操作创建一个块,并向其发布记录。它支持异步操作并保持顺序:
var block = new ActionBlock<Product>(async product =>
{
await product.ExecuteAsync();
});
block.Post(new Product());
如果需要,它还支持以并行和有限容量进行处理。如果您希望异步和顺序地处理记录,这听起来非常适合TPL Dataflow的ActionBlock。只需使用要执行的操作创建一个块,并向其发布记录。它支持异步操作并保持顺序:
var block = new ActionBlock<Product>(async product =>
{
await product.ExecuteAsync();
});
block.Post(new Product());
如果需要,它还支持并行和有限容量的处理。尝试使用Microsoft的反应式框架 这对我很有用:
IObservable<Task<string>> query =
from i in Observable.Range(0, 100, Scheduler.Default)
let item = "Product " + i
select AzureAsyncCall(item);
query
.Subscribe(async x =>
{
var result = await x;
/* do something with result */
});
我使用的AzureAsyncCall调用签名是公共任务AzureAsyncCallstring x
我放了一堆Console.WriteLineThread.CurrentThread.ManagedThreadId;调用以确保在测试代码中获得正确的异步行为。它工作得很好
所有调用都是异步的,并且一个接一个地序列化。尝试使用Microsoft的反应式框架 这对我很有用:
IObservable<Task<string>> query =
from i in Observable.Range(0, 100, Scheduler.Default)
let item = "Product " + i
select AzureAsyncCall(item);
query
.Subscribe(async x =>
{
var result = await x;
/* do something with result */
});
我使用的AzureAsyncCall调用签名是公共任务AzureAsyncCallstring x
我放了一堆Console.WriteLineThread.CurrentThread.ManagedThreadId;调用以确保在测试代码中获得正确的异步行为。它工作得很好
所有调用都是异步的,并且一个接一个地序列化。1。如果您想按顺序进行操作,那么使用API进行并发、并行执行永远不会是一个好的开始。2.当您避免阻塞操作时,异步方法是好的,但前提是您将实际的阻塞操作转换为异步:即不要阻塞锁ConcurrentQueue.Enqueue.First of All Task上的执行线程。延迟不是一个好的选择。。。。您的100个项目将一个接一个地取消排队,这意味着您现在有100个项目要插入,每个项目都是对Azure的异步请求。假设你有8个核心机器,有100个任务,你不能保证哪一个任务会完成,你能用一个稍微抽象一点的水平来描述你想做什么吗?例如,您是否只是尝试异步调用azure插入的顺序序列?1。如果您想按顺序进行操作,那么使用API进行并发、并行执行永远不会是一个好的开始。2.当您避免阻塞操作时,异步方法是好的,但前提是您将实际的阻塞操作转换为异步:即不要阻塞锁ConcurrentQueue.Enqueue.First of All Task上的执行线程。延迟不是一个好的选择。。。。您的100个项目将一个接一个地取消排队,这意味着您现在有100个项目要插入,每个项目都是对Azure的异步请求。假设你有8个核心机器,有100个任务,你不能保证哪一个任务会完成,你能用一个稍微抽象一点的水平来描述你想做什么吗?例如,您是否只是尝试异步调用azure插入的顺序序列?