例如,我有一些我希望在另一个线程中运行的同步函数。我找到了像这样的封闭方式。如果我不想创建任何新功能,有没有更有效和美丽的方式?我是重新发明轮子还是没事呢?
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中的回调添加一些代码行呢?
答案 0 :(得分:2)
你在这里创建lambda表达式:
Task.Run(() => LongOperation());
它可以包含多个语句:
Task.Run(() =>
{
LongOperation();
Console.WriteLine("Then callback triggered");
});
答案 1 :(得分:1)
您的帖子中不清楚的是LondOperation()
是受CPU限制还是仅受IO限制。如果您正在处理 CPU 绑定内容的集合,则可能需要Parallel.For(...)
或...AsParallel()...
LINQ
,这取决于您的答案;否则,对于 IO - 目的,Task
是最好的原生.NET支持选择(只是要知道还有其他常见方法,如rX
- "反应性扩展"但是Task
框架明显优于那些)。
正如其他人已经表明的那样,有一些延续允许你对异步调用进行排序;此外,.WhenAll/.WhenAny
有助于许多典型的企业"的情况。然而,您可以以Task.Run(...)
方式将同步代码包装到异步容器中。