Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按顺序处理异步调用_C#_.net_Azure_Asynchronous_Task Parallel Library - Fatal编程技术网

C# 按顺序处理异步调用

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

我正在对Azure表存储进行大量或异步调用。由于明显的原因,这些记录的插入顺序与调用顺序不同

我计划引入ConcurrentQueue以确保顺序。以下作为POC编写的示例代码似乎达到了预期的效果

我想知道这是确保异步调用的最好方法吗 将按顺序完成吗


如果您想要异步和顺序地处理记录,这听起来非常适合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插入的顺序序列?