应用程序(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++;
}
}
可能有更好的方法来实现此功能或一些巧妙的架构来忽略此问题?
成功实现了我的期望。 大多数情况下,我最初的想法是正确的,只需要进行一些小的修改。 他们在这里:
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++;
}
}