逐个运行动态添加的任务

问题描述 投票:0回答:1

应用程序(wpf、.net Framework 4.8)可以从外部(rpc、ui等)接收一些命令,并且接收速度比执行速度快。虽然命令与硬件一起工作,但我希望它们能够一一执行。 我寻找想法,因为我什至不确定我的计划是否可行。

我当前的想法是以某种方式使用Dataflow中的

ActionBlock
,但我不知道如何正确编写它。

类似这样的事情。

        class Foo
        {
            ActionBlock<Task> runner;
            int index = 0;

            public async void TestTask(int index)
            {
                await Task.Delay(new Random().Next(1000, 10000));
                Debug.WriteLine("Task completed " + index);
            }

            public Foo()
            {
                runner = new ActionBlock<Task>(task =>
                {
                    task();
                });
            }

            private async void button_Click(object sender, RoutedEventArgs e)
            {
                // should post TestTask(intex) for delayed execution 
                runner.Post(???);
                index++;
            }
        }

可能有更好的方法来实现此功能或一些巧妙的架构来忽略此问题?

c# .net asynchronous
1个回答
0
投票

成功实现了我的期望。 大多数情况下,我最初的想法是正确的,只需要进行一些小的修改。 他们在这里:

  • ActionBlock
    应该接受删除和参数的元组
  • ActionBlock
    的actoin应该是异步的并等待任务

用最少的代码来显示我的最终结果:

class Foo
{
    delegate Task TaskDelegate(int book);
    ActionBlock<Tuple<TaskDelegate, int>> runner;
    int index = 0;

    public async Task TestTask(int index)
    {
        await Task.Delay(new Random().Next(1000, 10000));
        Debug.WriteLine("Task completed " + index);
    }

    public Foo()
    {
        runner = new ActionBlock<Tuple<TaskDelegate, int>>(async task =>
        {
            await task.Item1(task.Item2);
        });
    }

    private async void button_Click(object sender, RoutedEventArgs e)
    {
        runner.Post(Tuple.Create<TaskDelegate, int>(TestTask, index));
        index++;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.