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

时间:2018-03-10 08:08:54

标签: 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中的回调添加一些代码行呢?

2 个答案:

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