Ste*_*rra 4 c# action asynchronous async-await
我在完成异步延迟任务时遇到了一些麻烦.我正在编写一个需要以数十/数十万个异步执行脚本的规模运行的应用程序.我正在使用C#Actions执行此操作,有时,在执行特定序列期间,为了使脚本正确执行,它需要等待外部资源才能达到预期状态.起初我使用Thread.Sleep()编写了这个,但结果是应用程序性能中的鱼雷,所以我正在研究async/await for async sleep.但我无法让它真正等待暂停!有人可以解释一下吗?
static void Main(string[] args)
{
var sync = new List<Action>();
var async = new List<Action>();
var syncStopWatch = new Stopwatch();
sync.Add(syncStopWatch.Start);
sync.Add(() => Thread.Sleep(1000));
sync.Add(syncStopWatch.Stop);
sync.Add(() => Console.Write("Sync:\t" + syncStopWatch.ElapsedMilliseconds + "\n"));
var asyncStopWatch = new Stopwatch();
sync.Add(asyncStopWatch.Start);
sync.Add(async () => await Task.Delay(1000));
sync.Add(asyncStopWatch.Stop);
sync.Add(() => Console.Write("Async:\t" + asyncStopWatch.ElapsedMilliseconds + "\n"));
foreach (Action a in sync)
{
a.Invoke();
}
foreach (Action a in async)
{
a.Invoke();
}
}
Run Code Online (Sandbox Code Playgroud)
执行结果如下:
同步:999
异步:2
如何让它等待异步?
你遇到了问题async void.将asynclambda 传递给a时Action,编译器会async void为您创建一个方法.
作为最佳实践,您应该避免async void.
实现此目的的一种方法是让您的操作列表实际上是一个List<Func<Task>>而不是List<Action>.这允许您排队async Task方法而不是async void方法.
这意味着您的"执行"代码必须在Task完成时等待每个代码.此外,您的同步方法必须返回Task.FromResult(0)或类似的东西,以便它们匹配Func<Task>签名.
如果您想要更大范围的解决方案,我建议您强烈考虑TPL Dataflow而不是创建自己的队列.
| 归档时间: |
|
| 查看次数: |
5371 次 |
| 最近记录: |