如何在 C# 中包装任何同步函数并使其异步

  • 本文关键字:函数 异步 同步 任何 包装 c#
  • 更新时间 :
  • 英文 :


例如,我有一些同步函数,我想在另一个线程中运行。我找到了这样的闭合方式。如果我不想创建任何新功能,还有比这更有效、更漂亮的方法吗?我是重新发明轮子还是没事?

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(...)方式将同步代码包装到异步容器中。

最新更新