例如,我有一些同步函数,我想在另一个线程中运行。我找到了这样的闭合方式。如果我不想创建任何新功能,还有比这更有效、更漂亮的方法吗?我是重新发明轮子还是没事?
class Program
{
static void Main(string[] args)
{
((Action)(async () =>
{
await Task.Run(() => LongOperation());
Console.WriteLine("Then callback triggered");
}))();
Console.WriteLine("Main thread finished first.");
Console.ReadKey();
}
static void LongOperation()
{
Thread.Sleep(3000);
Console.WriteLine("Work completed");
}
}
如果我只想异步执行该功能,我可以键入
Task.Run(() => LongOperation());
但是,如果我想像在 JavaScript 中那样为回调添加一些代码行怎么办?
你在这里创建lambda表达式:
Task.Run(() => LongOperation());
它可以包含多个语句:
Task.Run(() =>
{
LongOperation();
Console.WriteLine("Then callback triggered");
});
从你的帖子中不清楚的是,LondOperation()
是受 CPU 限制还是仅受 IO 限制。根据答案,您可能更喜欢Parallel.For(...)
或...AsParallel()...
LINQ
提供的,如果您正在处理 CPU 密集型内容的集合;否则,出于 IO 目的,Task
是本机 .NET 支持的最佳选择(只要知道还有其他常见的方法,如 rX
- "反应式扩展",但是Task
框架的性能明显优于这些(。
正如其他人已经表明的那样,有一些延续允许你对异步调用进行排序;此外,有一些.WhenAll/.WhenAny
在许多典型的"企业"情况下很有帮助。但是,您可以Task.Run(...)
方式将同步代码包装到异步容器中。