为什么c#的类的构造函数内不允许使用异步执行

如题所述

构造函只在实例化这个类的时候执行,执行之后才可以被初始化(静态类的静态构造函数在任何静态类的任何静态方法被调用时构造函数被执行)。实际上这个类初始化的过程就包括了自动执行构造函数。如果你的初始化过程(执行构造函数过程中)需要很长时间才能执行完,那么实际执行起来,初始化 这个对象(类)的时候也要等很长时间(同步等待)。

如果你真的有需要 初始化这个类过程异步等待也不是没办法,只需要调用改实例的时候异步就行了。参考一下:

public class TestFoo{
    public TestFoo(){
        Thread.Sleep(1000);
    }
    public string Foo(){
        return "OK";
    }
}

public static void Main(){
    TestFoo myfoo = null;
    Task.Run(()=>{
        myfoo = new TestFoo();
                Console.WriteLine(myfoo.Foo());
    });
    Console.WriteLine("Break 0");
    Console.ReadKey();
}

这个实际上的运行结果是 先输出break0 然后十秒后输出OK 。

人脑编译的没测试

实际上你的说法是有问题的。构造函数过程中是可以调用异步方法的。但是本身不可以被异步执行。

另一个例子,随便写的

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("break 0");
            TestFoo mytest = new TestFoo();
            Thread.Sleep(1000);
            mytest.Foo("User Call");
            Console.WriteLine("break 1");
            Console.ReadKey();
        }
    }
    public class TestFoo{
        public TestFoo() {
            Foo("Construction");
        }
        Task<string> Bar(string input) {
            Task<string> toout = Task<string>.Run(()=> {
                Thread.Sleep(5000);
                return input;
            });
            return toout;
        }
        public async void Foo(string input) {
            Console.WriteLine( await Bar(input));
        }
    }
温馨提示:答案为网友推荐,仅供参考
相似回答